]> source.dussan.org Git - nextcloud-server.git/commitdiff
Merge branch 'master' of git://gitorious.org/owncloud/owncloud into oracle-support
authorJörn Friedrich Dreyer <jfd@butonic.de>
Fri, 24 Aug 2012 22:05:07 +0000 (00:05 +0200)
committerJörn Friedrich Dreyer <jfd@butonic.de>
Fri, 24 Aug 2012 22:05:07 +0000 (00:05 +0200)
Conflicts:
3rdparty/Sabre/CardDAV/Plugin.php
3rdparty/smb4php/smb.php
apps/bookmarks/ajax/addBookmark.php
apps/bookmarks/ajax/editBookmark.php
apps/bookmarks/appinfo/migrate.php
apps/calendar/ajax/calendar/edit.form.php
apps/calendar/ajax/changeview.php
apps/calendar/ajax/import/import.php
apps/calendar/ajax/settings/guesstimezone.php
apps/calendar/ajax/settings/setfirstday.php
apps/calendar/ajax/settings/settimeformat.php
apps/calendar/ajax/share/changepermission.php
apps/calendar/ajax/share/share.php
apps/calendar/ajax/share/unshare.php
apps/calendar/appinfo/app.php
apps/calendar/appinfo/remote.php
apps/calendar/appinfo/update.php
apps/calendar/appinfo/version
apps/calendar/js/calendar.js
apps/calendar/l10n/da.php
apps/calendar/l10n/de.php
apps/calendar/l10n/fi_FI.php
apps/calendar/l10n/gl.php
apps/calendar/l10n/he.php
apps/calendar/l10n/hr.php
apps/calendar/l10n/ja_JP.php
apps/calendar/l10n/lb.php
apps/calendar/l10n/lt_LT.php
apps/calendar/l10n/nb_NO.php
apps/calendar/l10n/pl.php
apps/calendar/l10n/pt_PT.php
apps/calendar/l10n/ro.php
apps/calendar/l10n/ru.php
apps/calendar/l10n/sv.php
apps/calendar/l10n/zh_CN.php
apps/calendar/l10n/zh_TW.php
apps/calendar/lib/app.php
apps/calendar/lib/calendar.php
apps/calendar/lib/object.php
apps/calendar/lib/share.php
apps/calendar/templates/part.choosecalendar.rowfields.php
apps/calendar/templates/part.import.php
apps/calendar/templates/settings.php
apps/contacts/ajax/activation.php
apps/contacts/ajax/addressbook/delete.php
apps/contacts/ajax/contact/add.php
apps/contacts/ajax/contact/addproperty.php
apps/contacts/ajax/contact/delete.php
apps/contacts/ajax/contact/deleteproperty.php
apps/contacts/ajax/contact/saveproperty.php
apps/contacts/ajax/createaddressbook.php
apps/contacts/ajax/cropphoto.php
apps/contacts/ajax/currentphoto.php
apps/contacts/ajax/importaddressbook.php
apps/contacts/ajax/oc_photo.php
apps/contacts/ajax/savecrop.php
apps/contacts/ajax/selectaddressbook.php
apps/contacts/ajax/updateaddressbook.php
apps/contacts/ajax/uploadimport.php
apps/contacts/ajax/uploadphoto.php
apps/contacts/appinfo/migrate.php
apps/contacts/appinfo/remote.php
apps/contacts/css/contacts.css
apps/contacts/import.php
apps/contacts/index.php
apps/contacts/js/contacts.js
apps/contacts/l10n/ca.php
apps/contacts/l10n/cs_CZ.php
apps/contacts/l10n/da.php
apps/contacts/l10n/de.php
apps/contacts/l10n/el.php
apps/contacts/l10n/eo.php
apps/contacts/l10n/es.php
apps/contacts/l10n/et_EE.php
apps/contacts/l10n/eu.php
apps/contacts/l10n/fa.php
apps/contacts/l10n/fi_FI.php
apps/contacts/l10n/fr.php
apps/contacts/l10n/he.php
apps/contacts/l10n/hr.php
apps/contacts/l10n/hu_HU.php
apps/contacts/l10n/ia.php
apps/contacts/l10n/it.php
apps/contacts/l10n/ja_JP.php
apps/contacts/l10n/ko.php
apps/contacts/l10n/lb.php
apps/contacts/l10n/mk.php
apps/contacts/l10n/nb_NO.php
apps/contacts/l10n/nl.php
apps/contacts/l10n/pl.php
apps/contacts/l10n/pt_BR.php
apps/contacts/l10n/pt_PT.php
apps/contacts/l10n/ro.php
apps/contacts/l10n/ru.php
apps/contacts/l10n/sk_SK.php
apps/contacts/l10n/sl.php
apps/contacts/l10n/sv.php
apps/contacts/l10n/th_TH.php
apps/contacts/l10n/tr.php
apps/contacts/l10n/zh_CN.php
apps/contacts/l10n/zh_TW.php
apps/contacts/lib/addressbook.php
apps/contacts/lib/hooks.php
apps/contacts/lib/vcard.php
apps/contacts/photo.php
apps/contacts/templates/part.contact.php
apps/contacts/templates/part.contacts.php
apps/contacts/templates/part.cropphoto.php
apps/contacts/templates/part.importaddressbook.php
apps/contacts/templates/part.selectaddressbook.php
apps/contacts/thumbnail.php
apps/files/ajax/download.php
apps/files/ajax/newfile.php
apps/files/ajax/timezone.php
apps/files/appinfo/update.php
apps/files/appinfo/version
apps/files/index.php
apps/files/js/fileactions.js
apps/files/js/filelist.js
apps/files/js/files.js
apps/files/l10n/ar.php
apps/files/l10n/bg_BG.php
apps/files/l10n/ca.php
apps/files/l10n/cs_CZ.php
apps/files/l10n/da.php
apps/files/l10n/de.php
apps/files/l10n/el.php
apps/files/l10n/eo.php
apps/files/l10n/es.php
apps/files/l10n/et_EE.php
apps/files/l10n/eu.php
apps/files/l10n/fa.php
apps/files/l10n/fi_FI.php
apps/files/l10n/fr.php
apps/files/l10n/gl.php
apps/files/l10n/he.php
apps/files/l10n/hr.php
apps/files/l10n/hu_HU.php
apps/files/l10n/ia.php
apps/files/l10n/id.php
apps/files/l10n/it.php
apps/files/l10n/ja_JP.php
apps/files/l10n/ko.php
apps/files/l10n/lb.php
apps/files/l10n/lt_LT.php
apps/files/l10n/mk.php
apps/files/l10n/ms_MY.php
apps/files/l10n/nb_NO.php
apps/files/l10n/nl.php
apps/files/l10n/nn_NO.php
apps/files/l10n/pl.php
apps/files/l10n/pt_BR.php
apps/files/l10n/pt_PT.php
apps/files/l10n/ro.php
apps/files/l10n/ru.php
apps/files/l10n/sk_SK.php
apps/files/l10n/sl.php
apps/files/l10n/sr.php
apps/files/l10n/sr@latin.php
apps/files/l10n/sv.php
apps/files/l10n/th_TH.php
apps/files/l10n/tr.php
apps/files/l10n/uk.php
apps/files/l10n/zh_CN.php
apps/files/l10n/zh_TW.php
apps/files_archive/js/archive.js
apps/files_encryption/lib/cryptstream.php
apps/files_encryption/lib/proxy.php
apps/files_encryption/tests/proxy.php
apps/files_external/appinfo/app.php
apps/files_external/lib/smb.php
apps/files_external/lib/streamwrapper.php
apps/files_external/tests/config.php
apps/files_external/tests/smb.php
apps/files_sharing/ajax/email.php
apps/files_sharing/ajax/getitem.php
apps/files_sharing/ajax/setpermissions.php
apps/files_sharing/ajax/share.php
apps/files_sharing/ajax/toggleresharing.php
apps/files_sharing/ajax/unshare.php
apps/files_sharing/ajax/userautocomplete.php
apps/files_sharing/js/settings.js
apps/files_sharing/js/share.js
apps/files_sharing/lib_share.php
apps/files_sharing/settings.php
apps/files_sharing/sharedstorage.php
apps/files_sharing/templates/settings.php
apps/files_versions/ajax/rollbackVersion.php
apps/files_versions/versions.php
apps/gallery/ajax/thumbnail.php
apps/gallery/appinfo/app.php
apps/gallery/appinfo/update.php
apps/gallery/appinfo/version
apps/gallery/css/styles.css
apps/gallery/index.php
apps/gallery/js/pictures.js
apps/gallery/l10n/ca.php
apps/gallery/l10n/cs_CZ.php
apps/gallery/l10n/de.php
apps/gallery/l10n/el.php
apps/gallery/l10n/es.php
apps/gallery/l10n/fi_FI.php
apps/gallery/l10n/fr.php
apps/gallery/l10n/it.php
apps/gallery/l10n/pl.php
apps/gallery/l10n/pt_PT.php
apps/gallery/l10n/ru.php
apps/gallery/l10n/sl.php
apps/gallery/l10n/sv.php
apps/gallery/l10n/th_TH.php
apps/gallery/l10n/tr.php
apps/gallery/l10n/zh_CN.php
apps/gallery/lib/album.php
apps/gallery/lib/hooks_handlers.php
apps/gallery/lib/managers.php
apps/gallery/lib/photo.php
apps/gallery/lib/tiles.php
apps/gallery/lib/tiles_test.php
apps/gallery/templates/index.php
apps/media/lib_ampache.php
apps/media/lib_collection.php
apps/media/lib_media.php
apps/remoteStorage/lib_remoteStorage.php
apps/tasks/ajax/addtaskform.php
apps/tasks/ajax/edittask.php
apps/user_ldap/appinfo/update.php
apps/user_ldap/group_ldap.php
apps/user_ldap/lib_ldap.php
apps/user_ldap/settings.php
apps/user_ldap/templates/settings.php
apps/user_ldap/user_ldap.php
apps/user_migrate/appinfo/app.php
apps/user_migrate/templates/settings.php
apps/user_webfinger/host-meta.php
config/config.sample.php
core/js/js.js
core/l10n/da.php
core/l10n/de.php
core/l10n/fi_FI.php
core/l10n/gl.php
core/l10n/he.php
core/l10n/hr.php
core/l10n/id.php
core/l10n/ja_JP.php
core/l10n/lb.php
core/l10n/lt_LT.php
core/l10n/nb_NO.php
core/l10n/pl.php
core/l10n/pt_PT.php
core/l10n/ro.php
core/l10n/ru.php
core/l10n/sv.php
core/lostpassword/index.php
core/templates/layout.user.php
core/templates/login.php
db_structure.xml
index.php
l10n/af/calendar.po
l10n/af/contacts.po
l10n/af/core.po
l10n/af/files.po
l10n/af/settings.po
l10n/ar/calendar.po
l10n/ar/contacts.po
l10n/ar/core.po
l10n/ar/files.po
l10n/ar/media.po
l10n/ar/settings.po
l10n/bg_BG/calendar.po
l10n/bg_BG/contacts.po
l10n/bg_BG/core.po
l10n/bg_BG/files.po
l10n/bg_BG/media.po
l10n/bg_BG/settings.po
l10n/ca/calendar.po
l10n/ca/contacts.po
l10n/ca/core.po
l10n/ca/files.po
l10n/ca/gallery.po
l10n/ca/settings.po
l10n/cs_CZ/calendar.po
l10n/cs_CZ/contacts.po
l10n/cs_CZ/core.po
l10n/cs_CZ/files.po
l10n/cs_CZ/gallery.po
l10n/cs_CZ/settings.po
l10n/da/calendar.po
l10n/da/contacts.po
l10n/da/core.po
l10n/da/files.po
l10n/da/settings.po
l10n/de/calendar.po
l10n/de/contacts.po
l10n/de/core.po
l10n/de/files.po
l10n/de/gallery.po
l10n/de/settings.po
l10n/el/calendar.po
l10n/el/contacts.po
l10n/el/core.po
l10n/el/files.po
l10n/el/gallery.po
l10n/el/settings.po
l10n/eo/calendar.po
l10n/eo/contacts.po
l10n/eo/core.po
l10n/eo/files.po
l10n/eo/media.po
l10n/eo/settings.po
l10n/es/calendar.po
l10n/es/contacts.po
l10n/es/core.po
l10n/es/files.po
l10n/es/gallery.po
l10n/es/settings.po
l10n/et_EE/calendar.po
l10n/et_EE/contacts.po
l10n/et_EE/core.po
l10n/et_EE/files.po
l10n/et_EE/settings.po
l10n/eu/calendar.po
l10n/eu/contacts.po
l10n/eu/core.po
l10n/eu/files.po
l10n/eu/settings.po
l10n/fa/calendar.po
l10n/fa/contacts.po
l10n/fa/core.po
l10n/fa/files.po
l10n/fa/settings.po
l10n/fi_FI/calendar.po
l10n/fi_FI/contacts.po
l10n/fi_FI/core.po
l10n/fi_FI/files.po
l10n/fi_FI/gallery.po
l10n/fi_FI/settings.po
l10n/fr/calendar.po
l10n/fr/contacts.po
l10n/fr/core.po
l10n/fr/files.po
l10n/fr/gallery.po
l10n/fr/media.po
l10n/fr/settings.po
l10n/gl/calendar.po
l10n/gl/contacts.po
l10n/gl/core.po
l10n/gl/files.po
l10n/gl/settings.po
l10n/he/calendar.po
l10n/he/contacts.po
l10n/he/core.po
l10n/he/files.po
l10n/he/settings.po
l10n/hr/calendar.po
l10n/hr/contacts.po
l10n/hr/core.po
l10n/hr/files.po
l10n/hr/settings.po
l10n/hu_HU/calendar.po
l10n/hu_HU/contacts.po
l10n/hu_HU/core.po
l10n/hu_HU/files.po
l10n/hu_HU/settings.po
l10n/hy/calendar.po
l10n/hy/contacts.po
l10n/hy/core.po
l10n/hy/files.po
l10n/hy/settings.po
l10n/ia/calendar.po
l10n/ia/contacts.po
l10n/ia/core.po
l10n/ia/files.po
l10n/ia/settings.po
l10n/id/calendar.po
l10n/id/contacts.po
l10n/id/core.po
l10n/id/files.po
l10n/id/settings.po
l10n/it/calendar.po
l10n/it/contacts.po
l10n/it/core.po
l10n/it/files.po
l10n/it/gallery.po
l10n/it/settings.po
l10n/ja_JP/calendar.po
l10n/ja_JP/contacts.po
l10n/ja_JP/core.po
l10n/ja_JP/files.po
l10n/ja_JP/settings.po
l10n/ko/calendar.po
l10n/ko/contacts.po
l10n/ko/core.po
l10n/ko/files.po
l10n/ko/settings.po
l10n/lb/calendar.po
l10n/lb/contacts.po
l10n/lb/core.po
l10n/lb/files.po
l10n/lb/settings.po
l10n/lt_LT/calendar.po
l10n/lt_LT/contacts.po
l10n/lt_LT/core.po
l10n/lt_LT/files.po
l10n/lt_LT/settings.po
l10n/mk/calendar.po
l10n/mk/contacts.po
l10n/mk/core.po
l10n/mk/files.po
l10n/mk/settings.po
l10n/ms_MY/calendar.po
l10n/ms_MY/contacts.po
l10n/ms_MY/core.po
l10n/ms_MY/files.po
l10n/ms_MY/settings.po
l10n/nb_NO/calendar.po
l10n/nb_NO/contacts.po
l10n/nb_NO/core.po
l10n/nb_NO/files.po
l10n/nb_NO/settings.po
l10n/nl/calendar.po
l10n/nl/contacts.po
l10n/nl/core.po
l10n/nl/files.po
l10n/nl/settings.po
l10n/nn_NO/calendar.po
l10n/nn_NO/contacts.po
l10n/nn_NO/core.po
l10n/nn_NO/files.po
l10n/nn_NO/settings.po
l10n/pl/calendar.po
l10n/pl/contacts.po
l10n/pl/core.po
l10n/pl/files.po
l10n/pl/gallery.po
l10n/pl/settings.po
l10n/pt_BR/calendar.po
l10n/pt_BR/contacts.po
l10n/pt_BR/core.po
l10n/pt_BR/files.po
l10n/pt_BR/settings.po
l10n/pt_PT/calendar.po
l10n/pt_PT/contacts.po
l10n/pt_PT/core.po
l10n/pt_PT/files.po
l10n/pt_PT/gallery.po
l10n/pt_PT/settings.po
l10n/ro/calendar.po
l10n/ro/contacts.po
l10n/ro/core.po
l10n/ro/files.po
l10n/ro/settings.po
l10n/ru/calendar.po
l10n/ru/contacts.po
l10n/ru/core.po
l10n/ru/files.po
l10n/ru/gallery.po
l10n/ru/settings.po
l10n/sk_SK/calendar.po
l10n/sk_SK/contacts.po
l10n/sk_SK/core.po
l10n/sk_SK/files.po
l10n/sk_SK/settings.po
l10n/sl/calendar.po
l10n/sl/contacts.po
l10n/sl/core.po
l10n/sl/files.po
l10n/sl/gallery.po
l10n/sl/settings.po
l10n/sr/calendar.po
l10n/sr/contacts.po
l10n/sr/core.po
l10n/sr/files.po
l10n/sr/settings.po
l10n/sr@latin/calendar.po
l10n/sr@latin/contacts.po
l10n/sr@latin/core.po
l10n/sr@latin/files.po
l10n/sr@latin/settings.po
l10n/sv/calendar.po
l10n/sv/contacts.po
l10n/sv/core.po
l10n/sv/files.po
l10n/sv/gallery.po
l10n/sv/media.po
l10n/sv/settings.po
l10n/templates/bookmarks.pot
l10n/templates/calendar.pot
l10n/templates/contacts.pot
l10n/templates/core.pot
l10n/templates/files.pot
l10n/templates/gallery.pot
l10n/templates/media.pot
l10n/templates/settings.pot
l10n/th_TH/calendar.po
l10n/th_TH/contacts.po
l10n/th_TH/core.po
l10n/th_TH/files.po
l10n/th_TH/gallery.po
l10n/th_TH/settings.po
l10n/tr/calendar.po
l10n/tr/contacts.po
l10n/tr/core.po
l10n/tr/files.po
l10n/tr/gallery.po
l10n/tr/settings.po
l10n/uk/calendar.po
l10n/uk/contacts.po
l10n/uk/core.po
l10n/uk/files.po
l10n/uk/media.po
l10n/uk/settings.po
l10n/zh_CN/calendar.po
l10n/zh_CN/contacts.po
l10n/zh_CN/core.po
l10n/zh_CN/files.po
l10n/zh_CN/gallery.po
l10n/zh_CN/settings.po
l10n/zh_TW/calendar.po
l10n/zh_TW/contacts.po
l10n/zh_TW/core.po
l10n/zh_TW/files.po
l10n/zh_TW/settings.po
lib/app.php
lib/base.php
lib/connector/sabre/file.php
lib/connector/sabre/locks.php
lib/connector/sabre/node.php
lib/db.php
lib/filecache.php
lib/fileproxy/quota.php
lib/files.php
lib/filestorage/local.php
lib/filesystemview.php
lib/group/database.php
lib/helper.php
lib/installer.php
lib/json.php
lib/l10n.php
lib/migrate.php
lib/mimetypes.fixlist.php
lib/ocs.php
lib/preferences.php
lib/public/json.php
lib/public/util.php
lib/template.php
lib/user.php
lib/user/database.php
lib/util.php
lib/vcategories.php
ocs/providers.php
settings/admin.php
settings/ajax/lostpassword.php
settings/ajax/removeuser.php
settings/ajax/setbackgroundjobsmode.php
settings/ajax/setlanguage.php
settings/ajax/setquota.php
settings/ajax/togglegroups.php
settings/apps.php
settings/css/settings.css
settings/js/apps.js
settings/js/users.js
settings/l10n/bg_BG.php
settings/l10n/ca.php
settings/l10n/cs_CZ.php
settings/l10n/da.php
settings/l10n/de.php
settings/l10n/el.php
settings/l10n/eo.php
settings/l10n/es.php
settings/l10n/et_EE.php
settings/l10n/eu.php
settings/l10n/fa.php
settings/l10n/fi_FI.php
settings/l10n/fr.php
settings/l10n/gl.php
settings/l10n/he.php
settings/l10n/hr.php
settings/l10n/hu_HU.php
settings/l10n/it.php
settings/l10n/ja_JP.php
settings/l10n/ko.php
settings/l10n/lt_LT.php
settings/l10n/mk.php
settings/l10n/ms_MY.php
settings/l10n/nb_NO.php
settings/l10n/nl.php
settings/l10n/nn_NO.php
settings/l10n/pl.php
settings/l10n/pt_BR.php
settings/l10n/pt_PT.php
settings/l10n/ru.php
settings/l10n/sk_SK.php
settings/l10n/sl.php
settings/l10n/sv.php
settings/l10n/th_TH.php
settings/l10n/tr.php
settings/l10n/zh_CN.php
settings/personal.php
settings/templates/admin.php
settings/templates/users.php

123 files changed:
1  2 
apps/bookmarks/ajax/addBookmark.php
apps/bookmarks/ajax/delBookmark.php
apps/bookmarks/ajax/editBookmark.php
apps/bookmarks/ajax/recordClick.php
apps/bookmarks/bookmarksHelper.php
apps/bookmarks/lib/bookmarks.php
apps/calendar/ajax/changeview.php
apps/calendar/ajax/event/edit.form.php
apps/calendar/appinfo/database.xml
apps/calendar/appinfo/update.php
apps/calendar/l10n/da.php
apps/calendar/l10n/de.php
apps/calendar/l10n/gl.php
apps/calendar/l10n/hr.php
apps/calendar/l10n/ja_JP.php
apps/calendar/l10n/lb.php
apps/calendar/l10n/lt_LT.php
apps/calendar/l10n/nb_NO.php
apps/calendar/l10n/pl.php
apps/calendar/l10n/pt_PT.php
apps/calendar/l10n/ro.php
apps/calendar/l10n/ru.php
apps/calendar/l10n/sv.php
apps/calendar/l10n/zh_CN.php
apps/calendar/l10n/zh_TW.php
apps/calendar/lib/calendar.php
apps/calendar/lib/object.php
apps/calendar/lib/share.php
apps/contacts/ajax/loadcard.php
apps/contacts/appinfo/database.xml
apps/contacts/l10n/ca.php
apps/contacts/l10n/cs_CZ.php
apps/contacts/l10n/el.php
apps/contacts/l10n/es.php
apps/contacts/l10n/et_EE.php
apps/contacts/l10n/eu.php
apps/contacts/l10n/fa.php
apps/contacts/l10n/fr.php
apps/contacts/l10n/ia.php
apps/contacts/l10n/it.php
apps/contacts/l10n/mk.php
apps/contacts/l10n/nb_NO.php
apps/contacts/l10n/nl.php
apps/contacts/l10n/sk_SK.php
apps/contacts/l10n/sl.php
apps/contacts/l10n/th_TH.php
apps/contacts/l10n/tr.php
apps/contacts/l10n/zh_TW.php
apps/contacts/lib/addressbook.php
apps/contacts/lib/hooks.php
apps/contacts/lib/vcard.php
apps/files/l10n/ar.php
apps/files/l10n/bg_BG.php
apps/files/l10n/ca.php
apps/files/l10n/cs_CZ.php
apps/files/l10n/da.php
apps/files/l10n/de.php
apps/files/l10n/el.php
apps/files/l10n/eo.php
apps/files/l10n/es.php
apps/files/l10n/et_EE.php
apps/files/l10n/eu.php
apps/files/l10n/fa.php
apps/files/l10n/fr.php
apps/files/l10n/gl.php
apps/files/l10n/he.php
apps/files/l10n/hr.php
apps/files/l10n/hu_HU.php
apps/files/l10n/ia.php
apps/files/l10n/id.php
apps/files/l10n/it.php
apps/files/l10n/ja_JP.php
apps/files/l10n/ko.php
apps/files/l10n/lb.php
apps/files/l10n/lt_LT.php
apps/files/l10n/mk.php
apps/files/l10n/ms_MY.php
apps/files/l10n/nb_NO.php
apps/files/l10n/nl.php
apps/files/l10n/nn_NO.php
apps/files/l10n/pl.php
apps/files/l10n/pt_BR.php
apps/files/l10n/pt_PT.php
apps/files/l10n/sk_SK.php
apps/files/l10n/sl.php
apps/files/l10n/th_TH.php
apps/files/l10n/tr.php
apps/files/l10n/zh_CN.php
apps/files/l10n/zh_TW.php
apps/gallery/ajax/createAlbum.php
apps/gallery/ajax/sharing.php
apps/gallery/lib/album.php
apps/gallery/lib/managers.php
apps/gallery/lib/photo.php
apps/gallery/lib/scanner.php
apps/media/lib_ampache.php
apps/media/lib_collection.php
apps/media/lib_media.php
apps/remoteStorage/lib_remoteStorage.php
apps/user_openid/user_openid.php
core/js/js.js
db_structure.xml
index.php
lib/app.php
lib/appconfig.php
lib/connector/sabre/locks.php
lib/connector/sabre/node.php
lib/db.php
lib/filecache.php
lib/fileproxy.php
lib/filesystem.php
lib/group/database.php
lib/preferences.php
lib/public/db.php
lib/setup.php
lib/template.php
lib/updater.php
lib/user.php
lib/user/database.php
lib/vcategories.php
settings/ajax/changepassword.php
settings/ajax/creategroup.php
settings/ajax/createuser.php

index b4d0f33d721648c4d26fc38641bf329f4bc769f8,c8a64d531c9b976bc43d23db5c362309ff719c87..baf3a288c17dc3d0c0b22f968144b78023d0a32b
  * 
  */
  
 +//no apps or filesystem
 +$RUNTIME_NOSETUPFS=true;
 +
 + 
 +
  // Check if we are a user
  OCP\JSON::checkLoggedIn();
- OCP\JSON::checkAppEnabled('bookmarks');
  OCP\JSON::callCheck();
  
- require_once(OC::$APPSROOT . '/apps/bookmarks/bookmarksHelper.php');
+ OCP\JSON::checkAppEnabled('bookmarks');
+ require_once(OC_App::getAppPath('bookmarks').'/bookmarksHelper.php');
  $id = addBookmark($_POST['url'], $_POST['title'], $_POST['tags']);
- OCP\JSON::success(array('data' => $id));
+ OCP\JSON::success(array('data' => $id));
index 140da2a37d1f235a539be21e3f64deef66c07f07,ba1dfff3bed2a032df75a84c725c0cb07ab39ac0..26437ea0c8c5fa46e4a2d5183c5d4183288169ec
  * 
  */
  
- //no apps or filesystem
- $RUNTIME_NOSETUPFS=true;
-  
  // Check if we are a user
  OCP\JSON::checkLoggedIn();
+ OCP\JSON::callCheck();
  OCP\JSON::checkAppEnabled('bookmarks');
 +OCP\JSON::callCheck();
  
  $id = $_POST['id'];
  if (!OC_Bookmarks_Bookmarks::deleteUrl($id)){
Simple merge
Simple merge
Simple merge
index d569bf528a1072d5b674bf395679c19d998b0aff,86fba45a50ce57c1ab132ebb751d389cc1e322f0..e1e13388902b9e042d0382c77ac6dfaadb108b8c
@@@ -144,5 -145,4 +144,4 @@@ class OC_Bookmarks_Bookmarks
                $result = $query->execute();
                return true;
        }
 -}
 +}
- ?>
index 951f603ce85c13542c431a35782f89e4285c1084,47e690f3293004f31abcb9fc7af195e889305938..819025543a583387f1b85cd7b8bbb6278d7343d9
@@@ -14,7 -14,7 +14,7 @@@ switch($view)
        case 'list':
                break;
        default:
--              OCP\JSON::error(array('message'=>'unexspected parameter: ' . $view));
++              OCP\JSON::error(array('message'=>'unexpected parameter: ' . $view));
                exit;
  }
  OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'currentview', $view);
Simple merge
Simple merge
index 36551a2a93aee23a15fceec64c93b217afc27c60,ea07fadb737bd62ddccea9984d84939546125faf..a193d5e15687b581b47c8f2fbb9eb3533bcf50e9
  "Interval" => "Interval",
  "End" => "Afslutning",
  "occurrences" => "forekomster",
- "Import a calendar file" => "Importer en kalenderfil",
- "Please choose the calendar" => "Vælg venligst kalender",
  "create a new calendar" => "opret en ny kalender",
+ "Import a calendar file" => "Importer en kalenderfil",
+ "Please choose a calendar" => "Vælg en kalender",
  "Name of new calendar" => "Navn på ny kalender",
+ "A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "En kalender med dette navn findes allerede. Hvis du fortsætter alligevel, vil disse kalendere blive sammenlagt.",
  "Import" => "Importer",
 +"Importing calendar" => "Importerer kalender",
 +"Calendar imported successfully" => "Kalender importeret korrekt",
  "Close Dialog" => "Luk dialog",
  "Create a new event" => "Opret en ny begivenhed",
  "View an event" => "Vis en begivenhed",
index f12a18baad06b58b98e0c4bbaa2a86b12e4a298f,223e80effb0fdf3f6ea3cf645003e827a824d4c7..d91753ff74ad860568d040ebd2116fd7d3f0b5f5
  "Interval" => "Intervall",
  "End" => "Ende",
  "occurrences" => "Termine",
- "Import a calendar file" => "Kalenderdatei Importieren",
- "Please choose the calendar" => "Bitte wählen Sie den Kalender.",
  "create a new calendar" => "Neuen Kalender anlegen",
+ "Import a calendar file" => "Kalenderdatei importieren",
+ "Please choose a calendar" => "Wählen Sie bitte einen Kalender.",
  "Name of new calendar" => "Kalendername",
+ "Take an available name!" => "Wählen Sie einen verfügbaren Namen.",
+ "A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ein Kalender mit diesem Namen existiert bereits. Sollten Sie fortfahren, werden die beiden Kalender zusammengeführt.",
  "Import" => "Importieren",
 +"Importing calendar" => "Kalender wird importiert.",
 +"Calendar imported successfully" => "Kalender erfolgreich importiert",
  "Close Dialog" => "Dialog schließen",
  "Create a new event" => "Neues Ereignis",
  "View an event" => "Termin öffnen",
  "No categories selected" => "Keine Kategorie ausgewählt",
 +"Select category" => "Kategorie auswählen",
  "of" => "von",
  "at" => "um",
+ "General" => "Allgemein",
  "Timezone" => "Zeitzone",
- "Check always for changes of the timezone" => "immer die Zeitzone überprüfen",
- "Timeformat" => "Zeitformat",
- "24h" => "24h",
- "12h" => "12h",
- "First day of the week" => "erster Wochentag",
- "Calendar CalDAV syncing address:" => "Kalender CalDAV Synchronisationsadresse:",
- "Users" => "Nutzer",
- "select users" => "Nutzer auswählen",
+ "Update timezone automatically" => "Zeitzone automatisch aktualisieren",
+ "Time format" => "Zeitformat",
+ "24h" => "24 Stunden",
+ "12h" => "12 Stunden",
+ "Start week on" => "Erster Wochentag",
+ "Cache" => "Zwischenspeicher",
+ "Clear cache for repeating events" => "Lösche den Zwischenspeicher für wiederholende Veranstaltungen",
+ "URLs" => "URLs",
+ "Calendar CalDAV syncing addresses" => "CalDAV-Kalender gleicht Adressen ab",
+ "more info" => "weitere Informationen",
+ "Primary address (Kontact et al)" => "Primäre Adresse (Kontakt u.a.)",
+ "iOS/OS X" => "iOS/OS X",
+ "Read only iCalendar link(s)" => "Nur lesende(r) iCalender-Link(s)",
+ "Users" => "Benutzer",
+ "select users" => "Benutzer auswählen",
  "Editable" => "editierbar",
  "Groups" => "Gruppen",
  "select groups" => "Gruppen auswählen",
index 3178b1819ec57dac052e5502fb5954dc3d1687f5,ff7e4833ad1c47c84b96b85c94a65c9335866cd4..00a28cc70f466baf07648b0f8014528d1547df38
  "Interval" => "Intervalo",
  "End" => "Fin",
  "occurrences" => "acontecementos",
+ "create a new calendar" => "crear un novo calendario",
  "Import a calendar file" => "Importar un ficheiro de calendario",
 +"Please choose the calendar" => "Por favor, seleccione o calendario",
 +"create a new calendar" => "crear un novo calendario",
  "Name of new calendar" => "Nome do novo calendario",
  "Import" => "Importar",
 +"Importing calendar" => "Importar calendario",
 +"Calendar imported successfully" => "Calendario importado correctamente",
  "Close Dialog" => "Pechar diálogo",
  "Create a new event" => "Crear un novo evento",
  "View an event" => "Ver un evento",
  "of" => "de",
  "at" => "a",
  "Timezone" => "Fuso horario",
 +"Check always for changes of the timezone" => "Comprobar sempre cambios de fuso horario",
 +"Timeformat" => "Formato de hora",
  "24h" => "24h",
  "12h" => "12h",
- "First day of the week" => "Primeiro día da semana",
- "Calendar CalDAV syncing address:" => "Enderezo de sincronización do calendario CalDAV:",
  "Users" => "Usuarios",
  "select users" => "escoller usuarios",
  "Editable" => "Editable",
index 551bb4abbcbce33e28a9a0304ecde030f1d9d39a,4ab5b955186dabfba8a0cd344d257c2779c7d57b..07512b9605144f9037f850bc2df747023d5e35f3
  "of" => "od",
  "at" => "na",
  "Timezone" => "Vremenska zona",
- "Check always for changes of the timezone" => "Provjerite uvijek za promjene vremenske zone",
 +"Timeformat" => "Format vremena",
  "24h" => "24h",
  "12h" => "12h",
- "First day of the week" => "Prvi dan tjedna",
- "Calendar CalDAV syncing address:" => "Adresa za CalDAV sinkronizaciju kalendara:",
  "Users" => "Korisnici",
  "select users" => "odaberi korisnike",
  "Editable" => "Može se uređivati",
index c533a9bd1a7bf17df88d27aeca7a5649bacf0fbe,3c7793a8508f7b7095edb4b4022284ccee31b4c4..e59f186a0b225df74efe85187612fdd781e5dc14
  "by day and month" => "月と日で指定",
  "Date" => "日付",
  "Cal." => "カレンダー",
+ "Sun." => "日",
+ "Mon." => "月",
+ "Tue." => "火",
+ "Wed." => "水",
+ "Thu." => "木",
+ "Fri." => "金",
+ "Sat." => "土",
+ "Jan." => "1月",
+ "Feb." => "2月",
+ "Mar." => "3月",
+ "Apr." => "4月",
+ "May." => "5月",
+ "Jun." => "6月",
+ "Jul." => "7月",
+ "Aug." => "8月",
+ "Sep." => "9月",
+ "Oct." => "10月",
+ "Nov." => "11月",
+ "Dec." => "12月",
  "All day" => "終日",
- "New Calendar" => "新しくカレンダーを作成",
++"New Calendar" => "新しくカレンダーを作成する",
  "Missing fields" => "項目がありません",
  "Title" => "タイトル",
  "From Date" => "開始日",
Simple merge
index d7e15fb438f648231668157af38f28111ea7975a,feb8618897ce8054029f4ae74050c98b614f19fa..408718071e244086c50899089b70887b059de27f
  "Select weeks" => "Pasirinkite savaites",
  "Interval" => "Intervalas",
  "End" => "Pabaiga",
+ "create a new calendar" => "sukurti naują kalendorių",
  "Import a calendar file" => "Importuoti kalendoriaus failą",
 +"Please choose the calendar" => "Pasirinkite kalendorių",
 +"create a new calendar" => "sukurti naują kalendorių",
  "Name of new calendar" => "Naujo kalendoriaus pavadinimas",
  "Import" => "Importuoti",
 +"Importing calendar" => "Importuojamas kalendorius",
 +"Calendar imported successfully" => "Kalendorius sėkmingai importuotas",
  "Close Dialog" => "Uždaryti",
  "Create a new event" => "Sukurti naują įvykį",
  "View an event" => "Peržiūrėti įvykį",
  "No categories selected" => "Nepasirinktos jokios katagorijos",
- "Select category" => "Pasirinkite kategoriją",
  "Timezone" => "Laiko juosta",
 +"Check always for changes of the timezone" => "Visada tikrinti laiko zonos pasikeitimus",
 +"Timeformat" => "Laiko formatas",
  "24h" => "24val",
  "12h" => "12val",
- "Calendar CalDAV syncing address:" => "CalDAV kalendoriaus synchronizavimo adresas:",
  "Users" => "Vartotojai",
  "select users" => "pasirinkti vartotojus",
  "Editable" => "Redaguojamas",
index 95ba5a9dba2d20243c26e5c520a6d6ffc426a3ce,e4b859c737834b8d3a53b8dacd6a9b2dd2d8fa39..8f736869de1c41751477e3d0a2cf89f6528bba93
  "Interval" => "Intervall",
  "End" => "Slutt",
  "occurrences" => "forekomster",
+ "create a new calendar" => "Lag en ny kalender",
  "Import a calendar file" => "Importer en kalenderfil",
 +"Please choose the calendar" => "Vennligst velg kalenderen",
 +"create a new calendar" => "Lag en ny kalender",
  "Name of new calendar" => "Navn på ny kalender:",
  "Import" => "Importer",
 +"Importing calendar" => "Importerer kalender",
 +"Calendar imported successfully" => "Kalenderen ble importert uten feil",
  "Close Dialog" => "Lukk dialog",
  "Create a new event" => "Opprett en ny hendelse",
  "View an event" => "Se på hendelse",
  "No categories selected" => "Ingen kategorier valgt",
 +"Select category" => "Velg kategori",
  "Timezone" => "Tidssone",
 +"Check always for changes of the timezone" => "Se alltid etter endringer i tidssone",
 +"Timeformat" => "Tidsformat:",
  "24h" => "24 t",
  "12h" => "12 t",
- "Calendar CalDAV syncing address:" => "Synkroniseringsadresse fo kalender CalDAV:",
 +"First day of the week" => "Ukens første dag",
++"Calendar CalDAV syncing address:" => "Kalender CalDAV synkroniseringsadresse",
  "Users" => "Brukere",
  "select users" => "valgte brukere",
  "Editable" => "Redigerbar",
index e582cdbb9b342f1fffd1dfdcdac749bf8d2e6d60,8fd1c3c2b4bbee1339bc48cfa4546628db30c262..0174bef6fc203503b5e67364e4ab6b5592081c78
  "Interval" => "Interwał",
  "End" => "Koniec",
  "occurrences" => "wystąpienia",
- "Import a calendar file" => "Zaimportuj plik kalendarza",
- "Please choose the calendar" => "Proszę wybrać kalendarz",
  "create a new calendar" => "stwórz nowy kalendarz",
+ "Import a calendar file" => "Zaimportuj plik kalendarza",
+ "Please choose a calendar" => "Proszę wybierz kalendarz",
  "Name of new calendar" => "Nazwa kalendarza",
  "Import" => "Import",
 +"Importing calendar" => "Importuje kalendarz",
 +"Calendar imported successfully" => "Zaimportowano kalendarz",
  "Close Dialog" => "Zamknij okno",
  "Create a new event" => "Tworzenie nowego wydarzenia",
  "View an event" => "Zobacz wydarzenie",
  "of" => "z",
  "at" => "w",
  "Timezone" => "Strefa czasowa",
 +"Check always for changes of the timezone" => "Zawsze sprawdzaj zmiany strefy czasowej",
 +"Timeformat" => "Format czasu",
  "24h" => "24h",
  "12h" => "12h",
- "First day of the week" => "Pierwszy dzień tygodnia",
- "Calendar CalDAV syncing address:" => "Adres synchronizacji kalendarza CalDAV:",
+ "more info" => "więcej informacji",
+ "iOS/OS X" => "iOS/OS X",
+ "Read only iCalendar link(s)" => "Odczytać tylko linki iCalendar",
  "Users" => "Użytkownicy",
  "select users" => "wybierz użytkowników",
  "Editable" => "Edytowalne",
index 33f85569cca20a4774b3a63524fa90f1b654249c,d5ead9fd43f8ef164fdd5f02541a505f8fb11b63..81bab52e593438dd151742728e7006996e90da7f
  "Interval" => "Intervalo",
  "End" => "Fim",
  "occurrences" => "ocorrências",
- "Import a calendar file" => "Importar um ficheiro de calendário",
- "Please choose the calendar" => "Por favor escolhe o calendário",
  "create a new calendar" => "criar novo calendário",
+ "Import a calendar file" => "Importar um ficheiro de calendário",
+ "Please choose a calendar" => "Escolha um calendário por favor",
  "Name of new calendar" => "Nome do novo calendário",
+ "Take an available name!" => "Escolha um nome disponível!",
+ "A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Já existe um Calendário com esse nome. Se mesmo assim continuar, esses calendários serão fundidos.",
  "Import" => "Importar",
 +"Importing calendar" => "A importar calendário",
 +"Calendar imported successfully" => "Calendário importado com sucesso",
  "Close Dialog" => "Fechar diálogo",
  "Create a new event" => "Criar novo evento",
  "View an event" => "Ver um evento",
index 550afcd102f17f75715e497b3c1e45f0a5ac0900,528d9ae108f0d3a514b675b39aea21025983a7a9..696322dd730711ebf7830562a2bb0b0d9b45a246
  "Interval" => "Interval",
  "End" => "Sfârșit",
  "occurrences" => "repetiții",
+ "create a new calendar" => "crează un calendar nou",
  "Import a calendar file" => "Importă un calendar",
 +"Please choose the calendar" => "Alegeți calendarul",
 +"create a new calendar" => "crează un calendar nou",
  "Name of new calendar" => "Numele noului calendar",
  "Import" => "Importă",
 +"Importing calendar" => "Importă calendar",
 +"Calendar imported successfully" => "Calendarul a fost importat cu succes",
  "Close Dialog" => "Închide",
  "Create a new event" => "Crează un eveniment nou",
  "View an event" => "Vizualizează un eveniment",
  "of" => "din",
  "at" => "la",
  "Timezone" => "Fus orar",
 +"Check always for changes of the timezone" => "Verifică mereu pentru schimbări ale fusului orar",
 +"Timeformat" => "Forma de afișare a orei",
  "24h" => "24h",
  "12h" => "12h",
- "First day of the week" => "Prima zi a săptămînii",
- "Calendar CalDAV syncing address:" => "Adresa pentru sincronizarea calendarului CalDAV",
  "Users" => "Utilizatori",
  "select users" => "utilizatori selectați",
  "Editable" => "Editabil",
index af40b06b9ff169bf8f437c66085286844a4363a8,612a1e2ae2b5f332fc1a695a7243103243314bf2..fbf5ec5ff74269acbb42ef44a0d5b8360c043dbf
  "Interval" => "Интервал",
  "End" => "Окончание",
  "occurrences" => "повторений",
- "Import a calendar file" => "Импортировать календарь из файла",
- "Please choose the calendar" => "Пожалуйста, выберите календарь",
  "create a new calendar" => "Создать новый календарь",
+ "Import a calendar file" => "Импортировать календарь из файла",
+ "Please choose a calendar" => "Пожалуйста, выберите календарь",
  "Name of new calendar" => "Название нового календаря",
+ "Take an available name!" => "Возьмите разрешенное имя!",
+ "A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Календарь с таким именем уже существует. Если вы продолжите, одноименный календарь будет удален.",
  "Import" => "Импортировать",
 +"Importing calendar" => "Импортируется календарь",
 +"Calendar imported successfully" => "Календарь успешно импортирован",
  "Close Dialog" => "Закрыть Сообщение",
  "Create a new event" => "Создать новое событие",
  "View an event" => "Показать событие",
index 59f8c6e6b5dc288d5e2aa03ab44c7021f761bf25,7baa0309a64cdbcbb18c7539f6b06d5f10764271..4cea9073a26072ba49988c88eac52f307d6f663e
  "Interval" => "Hur ofta",
  "End" => "Slut",
  "occurrences" => "Händelser",
- "Import a calendar file" => "Importera en kalenderfil",
- "Please choose the calendar" => "Välj kalender",
  "create a new calendar" => "skapa en ny kalender",
+ "Import a calendar file" => "Importera en kalenderfil",
+ "Please choose a calendar" => "Välj en kalender",
  "Name of new calendar" => "Namn på ny kalender",
+ "Take an available name!" => "Ta ett ledigt namn!",
+ "A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "En kalender med detta namn finns redan. Om du fortsätter ändå så kommer dessa kalendrar att slås samman.",
  "Import" => "Importera",
 +"Importing calendar" => "Importerar kalender",
 +"Calendar imported successfully" => "Kalender importerades utan problem",
  "Close Dialog" => "Stäng ",
  "Create a new event" => "Skapa en ny händelse",
  "View an event" => "Visa en händelse",
  "of" => "av",
  "at" => "på",
  "Timezone" => "Tidszon",
 +"Check always for changes of the timezone" => "Kontrollera alltid ändringar i tidszon.",
 +"Timeformat" => "Tidsformat",
  "24h" => "24h",
  "12h" => "12h",
- "First day of the week" => "Första dagen av veckan",
- "Calendar CalDAV syncing address:" => "Synkroniseringsadress för CalDAV kalender:",
+ "Cache" => "Cache",
+ "Clear cache for repeating events" => "Töm cache för upprepade händelser",
+ "Calendar CalDAV syncing addresses" => "Kalender CalDAV synkroniserar adresser",
+ "more info" => "mer info",
+ "Primary address (Kontact et al)" => "Primary address (Kontact et al)",
+ "iOS/OS X" => "iOS/OS X",
+ "Read only iCalendar link(s)" => "Read only iCalendar link(s)",
  "Users" => "Användare",
  "select users" => "välj användare",
  "Editable" => "Redigerbar",
index bb7e0a2872439f00a76a6f0109848675581f540c,48d00d02d5f72f1fbf79a108494c0158685d5b4d..add84588d35c64db7fdd683f8191b5505632894a
  "Interval" => "间隔",
  "End" => "结束",
  "occurrences" => "次",
+ "create a new calendar" => "创建新日历",
  "Import a calendar file" => "导入日历文件",
 +"Please choose the calendar" => "请选择日历",
 +"create a new calendar" => "创建新日历",
  "Name of new calendar" => "新日历名称",
  "Import" => "导入",
 +"Importing calendar" => "导入日历",
 +"Calendar imported successfully" => "导入日历成功",
  "Close Dialog" => "关闭对话框",
  "Create a new event" => "创建新事件",
  "View an event" => "查看事件",
index 746594462c476d5e378ec5f706ee5131204b4c7b,c2c03a4d44e77d51fda317781eae101ea7f71321..48897b8ca06cb5275485f4ff2d017ea1f1bcc947
  "Interval" => "間隔",
  "End" => "結束",
  "occurrences" => "事件",
+ "create a new calendar" => "建立新日曆",
  "Import a calendar file" => "匯入日曆檔案",
 +"Please choose the calendar" => "請選擇日曆",
 +"create a new calendar" => "建立新日曆",
  "Name of new calendar" => "新日曆名稱",
  "Import" => "匯入",
 +"Importing calendar" => "匯入日曆",
 +"Calendar imported successfully" => "已成功匯入日曆",
  "Close Dialog" => "關閉對話",
  "Create a new event" => "建立一個新事件",
  "View an event" => "觀看一個活動",
  "of" => "於",
  "at" => "於",
  "Timezone" => "時區",
 +"Check always for changes of the timezone" => "總是檢查是否變更了時區",
 +"Timeformat" => "日期格式",
  "24h" => "24小時制",
  "12h" => "12小時制",
- "First day of the week" => "每週的第一天",
 +"Calendar CalDAV syncing address:" => "CalDAV 的日曆同步地址:",
  "Users" => "使用者",
  "select users" => "選擇使用者",
  "Editable" => "可編輯",
index 09cbee204dc6bf70da0e851769c9d8a4f05acce6,7778242464ca1622a91c9d513ecf0f9411166e3d..f8f5aab36366ade83ace2d2c0bac248190eb4bef
@@@ -44,17 -32,17 +32,17 @@@ class OC_Calendar_Calendar
        /**
         * @brief Returns the list of calendars for a specific user.
         * @param string $uid User ID
-        * @param boolean $active Only return calendars with this $active state, default(=null) is don't care
+        * @param boolean $active Only return calendars with this $active state, default(=false) is don't care
         * @return array
         */
-       public static function allCalendars($uid, $active=null){
+       public static function allCalendars($uid, $active=false){
                $values = array($uid);
                $active_where = '';
 -              if ($active){
 -                      $active_where = ' AND active = ?';
 +              if (!is_null($active) && $active){
 +                      $active_where = ' AND `active` = ?';
                        $values[] = $active;
                }
 -              $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_calendars WHERE userid = ?' . $active_where );
 +              $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_calendars` WHERE `userid` = ?' . $active_where );
                $result = $stmt->execute($values);
  
                $calendars = array();
  
                $uri = self::createURI($name, $uris );
  
 -              $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?)' );
 +              $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_calendars` (`userid`,`displayname`,`uri`,`ctag`,`calendarorder`,`calendarcolor`,`timezone`,`components`) VALUES(?,?,?,?,?,?,?,?)' );
                $result = $stmt->execute(array($userid,$name,$uri,1,$order,$color,$timezone,$components));
  
-               return OCP\DB::insertid('*PREFIX*calendar_calendars');
+               $insertid = OCP\DB::insertid('*PREFIX*calendar_calendars');
+               OCP\Util::emitHook('OC_Calendar', 'addCalendar', $insertid);
+               return $insertid;
        }
  
        /**
        public static function addCalendarFromDAVData($principaluri,$uri,$name,$components,$timezone,$order,$color){
                $userid = self::extractUserID($principaluri);
  
 -              $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?)' );
 +              $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_calendars` (`userid`,`displayname`,`uri`,`ctag`,`calendarorder`,`calendarcolor`,`timezone`,`components`) VALUES(?,?,?,?,?,?,?,?)' );
                $result = $stmt->execute(array($userid,$name,$uri,1,$order,$color,$timezone,$components));
  
-               return OCP\DB::insertid('*PREFIX*calendar_calendars');
+               $insertid = OCP\DB::insertid('*PREFIX*calendar_calendars');
+               OCP\Util::emitHook('OC_Calendar', 'addCalendar', $insertid);
+               return $insertid;
        }
  
        /**
                if(is_null($order)) $order = $calendar['calendarorder'];
                if(is_null($color)) $color = $calendar['calendarcolor'];
  
 -              $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET displayname=?,calendarorder=?,calendarcolor=?,timezone=?,components=?,ctag=ctag+1 WHERE id=?' );
 +              $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_calendars` SET `displayname`=?,`calendarorder`=?,`calendarcolor`=?,`timezone`=?,`components`=?,`ctag`=`ctag`+1 WHERE `id`=?' );
                $result = $stmt->execute(array($name,$order,$color,$timezone,$components,$id));
  
+               OCP\Util::emitHook('OC_Calendar', 'editCalendar', $id);
                return true;
        }
  
         * @return boolean
         */
        public static function deleteCalendar($id){
 -              $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_calendars WHERE id = ?' );
 +              $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_calendars` WHERE `id` = ?' );
                $stmt->execute(array($id));
  
 -              $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ?' );
 +              $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ?' );
                $stmt->execute(array($id));
  
+               OCP\Util::emitHook('OC_Calendar', 'deleteCalendar', $id);
+               if(count(self::allCalendars(OCP\USER::getUser())) == 0) {
+                       self::addCalendar(OCP\USER::getUser(),'Default calendar');
+               }
                return true;
        }
+       
+       /**
+        * @brief merges two calendars
+        * @param integer $id1
+        * @param integer $id2
+        * @return boolean
+        */
+       public static function mergeCalendar($id1, $id2){
 -              $stmt = OCP\DB::prepare('UPDATE *PREFIX*calendar_objects SET calendarid = ? WHERE calendarid = ?');
++              $stmt = OCP\DB::prepare('UPDATE `*PREFIX*calendar_objects` SET `calendarid` = ? WHERE `calendarid` = ?');
+               $stmt->execute(array($id1, $id2));
+               self::touchCalendar($id1);
+               self::deleteCalendar($id2);
+       }
+       
        /**
         * @brief Creates a URI for Calendar
         * @param string $name name of the calendar
index df866bd3c5f9ea6156032dea74b4d70f310548a5,34676830205af9e6e4daa65e5beeaa8d38010222..8020d7c2e53afd821a3c1c99061d812a44eb98dd
@@@ -181,9 -204,10 +204,10 @@@ class OC_Calendar_Object
         */
        public static function delete($id){
                $oldobject = self::find($id);
 -              $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE id = ?' );
 +              $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_objects` WHERE `id` = ?' );
                $stmt->execute(array($id));
                OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']);
+               OCP\Util::emitHook('OC_Calendar', 'deleteEvent', $id);
  
                return true;
        }
         * @return boolean
         */
        public static function deleteFromDAVData($cid,$uri){
 -              $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ? AND uri=?' );
+               $oldobject = self::findWhereDAVDataIs($cid, $uri);
 +              $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_objects` WHERE `calendarid`= ? AND `uri`=?' );
                $stmt->execute(array($cid,$uri));
                OC_Calendar_Calendar::touchCalendar($cid);
+               OCP\Util::emitHook('OC_Calendar', 'deleteEvent', $oldobject['id']);
  
                return true;
        }
index aba2722165346bea68561e28524fc68d3b97b70b,e5ffc04143a6599336520ae034ad44ba507265af..23892157fef83d6c513d564fbf22f1e8530d6fe2
  class OC_Calendar_Share{
        const CALENDAR = 'calendar';
        const EVENT = 'event';
-       /*
+       /**
         * @brief: returns informations about all calendar or events which users are sharing with the user - userid
-        * @param: (string) $userid - id of the user
-        * @param: (string) $type - use const self::CALENDAR or self::EVENT
-        * @return: (array) $return - information about calendars
+        * @param: string $userid - id of the user
+        * @param: string $type - use const self::CALENDAR or self::EVENT
+        * @return: array $return - information about calendars
         */
        public static function allSharedwithuser($userid, $type, $active=null, $permission=null){
-               $group_where = self::group_sql(OC_Group::getUserGroups($userid));
-               $permission_where = self::permission_sql($permission);
-               if($type == self::CALENDAR){
-                       $active_where = self::active_sql($active);
-               }else{
-                       $active_where = '';
-               }
-               $stmt = OCP\DB::prepare("SELECT * FROM `*PREFIX*calendar_share_" . $type . "` WHERE ((`share` = ? AND `sharetype` = 'user') " . $group_where . ") AND `owner` <> ? " . $permission_where . " " . $active_where);
-               $result = $stmt->execute(array($userid, $userid));
-               $return = array();
-               while( $row = $result->fetchRow()){
-                       $return[] = $row;
+               $format = OC_Share_Backend_Calendar::FORMAT_CALENDAR;
+               if ($type == self::EVENT) {
+                       $format = OC_Share_Backend_Event::FORMAT_EVENT;
                }
+               $return = OCP\Share::getItemsSharedWith($type,
+                       $format,
+                       array(
+                               'active' => $active,
+                               'permissions' => $permission,
+                       ));
                return $return;
        }
-       /*
+       /**
         * @brief: returns all users a calendar / event is shared with
-        * @param: (int) id - id of the calendar / event
-        * @param: (string) $type - use const self::CALENDAR or self::EVENT
-        * @return: (array) $users - information about users a calendar / event is shared with
+        * @param: integer id - id of the calendar / event
+        * @param: string $type - use const self::CALENDAR or self::EVENT
+        * @return: array $users - information about users a calendar / event is shared with
         */
        public static function allUsersSharedwith($id, $type){
 -              $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_share_' . $type . ' WHERE ' . $type . 'id = ? ORDER BY share');
 +              $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE `' . $type . 'id` = ? ORDER BY `share`');
                $result = $stmt->execute(array($id));
                $users = array();
                while( $row = $result->fetchRow()){
                        return true;
                }
        }
-       /*
+       /**
         * @brief: stops sharing a calendar / event
-        * @param: (string) $owner - userid of the owner
-        * @param: (string) $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public)
-        * @param: (string) $sharetype - type of sharing (can be: user/group/public)
-        * @param: (string) $id - id of the calendar / event
-        * @param: (string) $type - use const self::CALENDAR or self::EVENT
-        * @return (bool)
+        * @param: string $owner - userid of the owner
+        * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public)
+        * @param: string $sharetype - type of sharing (can be: user/group/public)
+        * @param: string $id - id of the calendar / event
+        * @param: string $type - use const self::CALENDAR or self::EVENT
+        * @return boolean
         */
        public static function unshare($owner, $share, $sharetype, $id, $type){
 -              $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_' . $type . ' WHERE owner = ? ' . (($sharetype != 'public')?'AND share = ?':'') . ' AND sharetype = ? AND ' . $type . 'id = ?');
 +              $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_' . $type . '` WHERE `owner` = ? ' . (($sharetype != 'public')?'AND `share` = ?':'') . ' AND `sharetype` = ? AND `' . $type . 'id` = ?');
                if($sharetype != 'public'){
                        $stmt->execute(array($owner,$share,$sharetype,$id));
                }else{
                $token = md5($string);
                return substr($token, rand(0,16), 15);
        }
-       /*
+       /**
         * @brief: checks if it is already shared
-        * @param: (string) $owner - userid of the owner
-        * @param: (string) $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public)
-        * @param: (string) $sharetype - type of sharing (can be: user/group/public)
-        * @param: (string) $id - id of the calendar / event
-        * @param: (string) $type - use const self::CALENDAR or self::EVENT
-        * @return (bool)
+        * @param: string $owner - userid of the owner
+        * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public)
+        * @param: string $sharetype - type of sharing (can be: user/group/public)
+        * @param: string $id - id of the calendar / event
+        * @param: string $type - use const self::CALENDAR or self::EVENT
+        * @return boolean
         */
        public static function is_already_shared($owner, $share, $sharetype, $id, $type){
 -              $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_share_' . $type . ' WHERE owner = ? AND share = ? AND sharetype = ? AND ' . $type . 'id = ?');
 +              $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE `owner` = ? AND `share` = ? AND `sharetype` = ? AND `' . $type . 'id` = ?');
                $result = $stmt->execute(array($owner, $share, $sharetype, $id));
                if($result->numRows() > 0){
                        return true;
         */
        public static function check_access($share, $id, $type){
                $group_where = self::group_sql(OC_Group::getUserGroups($share));
-               $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share`_' . $type . '` WHERE (`' . $type . 'id` = ? AND (`share` = ? AND `sharetype` = \'user\') ' . $group_where . ')');
 -              $stmt = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . $type . " WHERE (" . $type . "id = ? AND (share = ? AND sharetype = 'user') " . $group_where . ")");
++              $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE (`' . $type . 'id` = ? AND (`share` = ? AND `sharetype` = \'user\') ' . $group_where . ')');
                $result = $stmt->execute(array($id,$share));
                $rows =  $result->numRows();
                if($rows > 0){
                        return $return;
          }
                
-               /*
+               /**
                 * @brief sets the active status of the calendar
-                * @param (string) $
+                * @param string 
                 */
                public static function set_active($share, $id, $active){
 -                      $stmt = OCP\DB::prepare("UPDATE *PREFIX*calendar_share_calendar SET active = ? WHERE share = ? AND sharetype = 'user' AND calendarid = ?");
 +                      $stmt = OCP\DB::prepare("UPDATE `*PREFIX*calendar_share_calendar` SET `active` = ? WHERE `share` = ? AND `sharetype` = 'user' AND `calendarid` = ?");
                        $stmt->execute(array($active, $share, $id));
                }
  
-               /*
-                * @brief delete all shared calendars / events after a user was deleted
-                * @param (string) $userid
-                * @return (bool)
+               /**
+                * @brief deletes all shared calendars / events after a user was deleted
+                * @param string $userid
+                * @return boolean
                 */
                public static function post_userdelete($userid){                        
 -                      $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_calendar WHERE owner = ?');
 +                      $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_calendar` WHERE `owner` = ?');
                        $stmt->execute(array($userid));
 -                      $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_event WHERE owner = ?');
 +                      $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_event` WHERE `owner` = ?');
                        $stmt->execute(array($userid));
 -                      $stmt = OCP\DB::prepare("DELETE FROM *PREFIX*calendar_share_calendar WHERE share = ? AND sharetype = 'user'");
 +                      $stmt = OCP\DB::prepare("DELETE FROM `*PREFIX*calendar_share_calendar` WHERE `share` = ? AND `sharetype` = 'user'");
                        $stmt->execute(array($userid));
 -                      $stmt = OCP\DB::prepare("DELETE FROM *PREFIX*calendar_share_event WHERE share = ? AND sharetype = 'user'");
 +                      $stmt = OCP\DB::prepare("DELETE FROM `*PREFIX*calendar_share_event` WHERE `share` = ? AND `sharetype` = 'user'");
                        $stmt->execute(array($userid));
                        return true;
                }
 -                      $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_calendar WHERE calendarid = ?');
+               
+               /**
+                * @brief deletes all shared events of a calendar
+                * @param integer $calid
+                * @return boolean
+                */
+               public static function post_caldelete($calid){
 -                      $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_event WHERE eventid = ?');
++                      $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_calendar` WHERE `calendarid` = ?');
+                       $stmt->execute(array($calid));
+                       return true;
+               }
+               
+               /**
+                * @brief deletes all shares of an event
+                * @param integer $eventid
+                * @return boolean
+                */
+               public static function post_eventdelete($eventid){
++                      $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_event` WHERE `eventid` = ?');
+                       $stmt->execute(array($eventid));
+                       return true;
+               }
  }
index 09b6bbe0cf9c6338552df6481a9132e6b04c9461,7d73641818b621e8a0ba0935e7e37e87b254dc03..82501ffd2ff744d306bb96b1a2126779553b4205
@@@ -48,15 -35,23 +35,24 @@@ $maxUploadFilesize = min($maxUploadFile
  $adr_types = OC_Contacts_App::getTypesOfProperty('ADR');
  $phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
  $email_types = OC_Contacts_App::getTypesOfProperty('EMAIL');
+ $impp_types = OC_Contacts_App::getTypesOfProperty('IMPP');
+ $ims = OC_Contacts_App::getIMOptions();
+ $im_protocols = array();
+ foreach($ims as $name => $values) {
+       $im_protocols[$name] = $values['displayname'];
+ }
  
- $tmpl = new OCP\Template('contacts','part.contact');
+ $tmpl = new OCP\Template('contacts', 'part.contact');
  $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize);
 +$tmpl->assign('requesttoken', $_SERVER['HTTP_REQUESTTOKEN']);
  $tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize));
- $tmpl->assign('adr_types',$adr_types);
- $tmpl->assign('phone_types',$phone_types);
- $tmpl->assign('email_types',$email_types);
- $tmpl->assign('id','');
+ $tmpl->assign('adr_types', $adr_types);
+ $tmpl->assign('phone_types', $phone_types);
+ $tmpl->assign('email_types', $email_types);
+ $tmpl->assign('impp_types', $impp_types, false);
+ $tmpl->assign('im_protocols', $im_protocols, false);
+ $tmpl->assign('requesttoken', $requesttoken);
+ $tmpl->assign('id', '');
  $page = $tmpl->fetchPage();
  
  OCP\JSON::success(array('data' => array( 'page' => $page )));
Simple merge
index 0c95b83d5ebdda1accecec031142968354fa7c82,2004d416b34c4be4b082a48eb008a45a03053265..b930d7c685c48234f4411055a672205ebc331110
  "Please choose the addressbook" => "Escolliu la llibreta d'adreces",
  "create a new addressbook" => "crea una llibreta d'adreces nova",
  "Name of new addressbook" => "Nom de la nova llibreta d'adreces",
- "Import" => "Importa",
  "Importing contacts" => "S'estan important contactes",
++"Contacts imported successfully" => "Els contactes s'han importat correctament",
++"Close Dialog" => "Tanca el diàleg",
++"Import Addressbook" => "Importa la llibreta d'adreces",
 +"Select address book to import to:" => "Seleccioneu la llibreta d'adreces a la que voleu importar:",
++"Drop a VCF file to import contacts." => "Elimina un fitxer VCF per importar contactes.",
 +"Select from HD" => "Selecciona de HD",
  "You have no contacts in your addressbook." => "No teniu contactes a la llibreta d'adreces.",
  "Add contact" => "Afegeix un contacte",
- "Configure addressbooks" => "Configura les llibretes d'adreces",
+ "Select Address Books" => "Selecccioneu llibretes d'adreces",
+ "Enter name" => "Escriviu un nom",
+ "Enter description" => "Escriviu una descripció",
  "CardDAV syncing addresses" => "Adreces de sincronització CardDAV",
  "more info" => "més informació",
  "Primary address (Kontact et al)" => "Adreça primària (Kontact i al)",
index 391a62010b1b0b8b2b1880702de65478c46ea689,966743a13f61e350bf0285fdc04de15649154670..830077aa2787812fed0529ab5c97c09a21f6ea5b
  "Please choose the addressbook" => "Prosím zvolte adresář",
  "create a new addressbook" => "vytvořit nový adresář",
  "Name of new addressbook" => "Jméno nového adresáře",
- "Import" => "Import",
  "Importing contacts" => "Importování kontaktů",
++"Contacts imported successfully" => "Kontakty úspěšně importovány",
++"Close Dialog" => "Zavírací dialog",
++"Import Addressbook" => "Importovat adresář",
 +"Select address book to import to:" => "Vyberte adresář do kterého chcete importovat:",
++"Drop a VCF file to import contacts." => "Pro import kontaktů sem přetáhněte soubor VCF",
 +"Select from HD" => "Vybrat z disku",
  "You have no contacts in your addressbook." => "Nemáte žádné kontakty v adresáři.",
  "Add contact" => "Přidat kontakt",
- "Configure addressbooks" => "Nastavit adresář",
+ "Select Address Books" => "Vybrat Adresář",
+ "Enter name" => "Vložte jméno",
+ "Enter description" => "Vložte popis",
  "CardDAV syncing addresses" => "Adresa pro synchronizaci pomocí CardDAV:",
  "more info" => "víc informací",
  "Primary address (Kontact et al)" => "Hlavní adresa (Kontakt etc)",
index f015f0ca3638cdf6ca1f03ee87e09c68e6959023,638085f5156e7c08a7f5ae0e4e48fa314f6b663e..3552ffba61601622a5da6a468af832b62191a6ac
  "Please choose the addressbook" => "Παρακαλώ επέλεξε βιβλίο διευθύνσεων",
  "create a new addressbook" => "Δημιουργία νέου βιβλίου διευθύνσεων",
  "Name of new addressbook" => "Όνομα νέου βιβλίου διευθύνσεων",
- "Import" => "Εισαγωγή",
  "Importing contacts" => "Εισαγωγή επαφών",
++"Contacts imported successfully" => "Οι επαφές εισήχθησαν επιτυχώς",
++"Close Dialog" => "Κλείσιμο διαλόγου",
++"Import Addressbook" => "Εισαγωγή βιβλίου διευθύνσεων",
 +"Select address book to import to:" => "Επέλεξε σε ποιο βιβλίο διευθύνσεων για εισαγωγή:",
++"Drop a VCF file to import contacts." => "Εισάγεται ένα VCF αρχείο για εισαγωγή επαφών",
 +"Select from HD" => "Επιλογή από HD",
  "You have no contacts in your addressbook." => "Δεν έχεις επαφές στο βιβλίο διευθύνσεων",
  "Add contact" => "Προσθήκη επαφής",
- "Configure addressbooks" => "Ρύθμισε το βιβλίο διευθύνσεων",
+ "Select Address Books" => "Επέλεξε βιβλίο διευθύνσεων",
+ "Enter name" => "Εισαγωγή ονόματος",
+ "Enter description" => "Εισαγωγή περιγραφής",
  "CardDAV syncing addresses" => "συγχρονισμός διευθύνσεων μέσω CardDAV ",
  "more info" => "περισσότερες πληροφορίες",
  "Primary address (Kontact et al)" => "Κύρια διεύθυνση",
index 2bdb300aa8fbb0f44b290aca20785dd0ecd2b14a,543bda3036ba20db270f0c44484d6f3b3fcfac3f..c80c2987e102dec8b505af35cdf46365e948a30d
  "Please choose the addressbook" => "Por favor escoge la agenda",
  "create a new addressbook" => "crear una nueva agenda",
  "Name of new addressbook" => "Nombre de la nueva agenda",
- "Import" => "Importar",
  "Importing contacts" => "Importando contactos",
++"Contacts imported successfully" => "Contactos importados correctamente",
++"Close Dialog" => "Cerrar Diálogo",
++"Import Addressbook" => "Importar agenda",
 +"Select address book to import to:" => "Selecciona una agenda para importar a:",
++"Drop a VCF file to import contacts." => "Suelta un archivo VCF para importar contactos.",
 +"Select from HD" => "Seleccionar del disco duro",
  "You have no contacts in your addressbook." => "No hay contactos en tu agenda.",
  "Add contact" => "Añadir contacto",
- "Configure addressbooks" => "Configurar agenda",
+ "Enter name" => "Introducir nombre",
+ "Enter description" => "Introducir descripción",
  "CardDAV syncing addresses" => "Sincronizando direcciones",
  "more info" => "más información",
  "Primary address (Kontact et al)" => "Dirección primaria (Kontact et al)",
index 39a287c9619bb76890ada0c3e524ee015bcc1312,ea0f80ec51500e27e44a2343057f18e2f674e904..e15ea0c10bd14aa6580a21bbd1c2150f0bfe469f
  "Please choose the addressbook" => "Palun vali aadressiraamat",
  "create a new addressbook" => "loo uus aadressiraamat",
  "Name of new addressbook" => "Uue aadressiraamatu nimi",
- "Import" => "Impordi",
  "Importing contacts" => "Kontaktide importimine",
++"Contacts imported successfully" => "Kontaktid on imporditud",
++"Close Dialog" => "Sulge dialoog",
++"Import Addressbook" => "Impordi aadressiraamat",
 +"Select address book to import to:" => "Vali aadressiraamat, millesse importida:",
++"Drop a VCF file to import contacts." => "Lohista siia VCF-fail, millest kontakte importida.",
 +"Select from HD" => "Vali kõvakettalt",
  "You have no contacts in your addressbook." => "Sinu aadressiraamatus pole ühtegi kontakti.",
  "Add contact" => "Lisa kontakt",
- "Configure addressbooks" => "Seadista aadressiraamatuid",
  "CardDAV syncing addresses" => "CardDAV sünkroniseerimise aadressid",
  "more info" => "lisainfo",
  "Primary address (Kontact et al)" => "Peamine aadress",
index 6dfbf0a7b235c99ccdd68e6f672cdb3f9c591f6b,56a481267026dd758d6e094b821ce11456b73dde..b676b45c0fdf1d4515478ad5df840577815321f2
  "Please choose the addressbook" => "Mesedez, aukeratu helbide liburua",
  "create a new addressbook" => "sortu helbide liburu berria",
  "Name of new addressbook" => "Helbide liburuaren izena",
- "Import" => "Inportatu",
  "Importing contacts" => "Kontaktuak inportatzen",
++"Contacts imported successfully" => "Kontaktuak ongi inportatu dira",
++"Close Dialog" => "Dialogoa itxi",
++"Import Addressbook" => "Inporatu helbide liburua",
 +"Select address book to import to:" => "Hautau helburuko helbide liburua:",
++"Drop a VCF file to import contacts." => "Askatu VCF fitxategia kontaktuak inportatzeko.",
 +"Select from HD" => "Hautatu disko gogorretik",
  "You have no contacts in your addressbook." => "Ez duzu kontakturik zure helbide liburuan.",
  "Add contact" => "Gehitu kontaktua",
- "Configure addressbooks" => "Konfiguratu helbide liburuak",
+ "Select Address Books" => "Hautatu helbide-liburuak",
+ "Enter name" => "Sartu izena",
+ "Enter description" => "Sartu deskribapena",
  "CardDAV syncing addresses" => "CardDAV sinkronizazio helbideak",
  "more info" => "informazio gehiago",
  "Primary address (Kontact et al)" => "Helbide nagusia",
index 9278975c4070ae9b702833ab9b5cf52d06be5440,8029cd201edefde2d92ee23cae0626c4cf6d3d92..9ee6ee546617113e21156f7b4b1ffdd0e37bce8c
  "Please choose the addressbook" => "لطفا یک کتابچه نشانی انتخاب کنید",
  "create a new addressbook" => "یک کتابچه نشانی بسازید",
  "Name of new addressbook" => "نام کتابچه نشانی جدید",
- "Import" => "وارد کردن",
  "Importing contacts" => "وارد کردن اشخاص",
++"Contacts imported successfully" => "اشخاص با موفقیت افزوده شدند",
++"Close Dialog" => "بستن دیالوگ",
++"Import Addressbook" => "وارد کردن کتابچه نشانی",
 +"Select address book to import to:" => "یک کتابچه نشانی انتخاب کنید تا وارد شود",
++"Drop a VCF file to import contacts." => "یک پرونده VCF را به اینجا بکشید تا اشخاص افزوده شوند",
 +"Select from HD" => "انتخاب از دیسک سخت",
  "You have no contacts in your addressbook." => "شماهیچ شخصی در  کتابچه نشانی خود ندارید",
  "Add contact" => "افزودن اطلاعات شخص مورد نظر",
- "Configure addressbooks" => "پیکربندی کتابچه ی نشانی ها",
  "CardDAV syncing addresses" => "CardDAV syncing addresses ",
  "more info" => "اطلاعات بیشتر",
  "Primary address (Kontact et al)" => "نشانی اولیه",
index 0a2a4e58b9fa611a7f6b051fc951aad6aebe67b7,613871706d36c5d605365965e4da5b856b82df70..87942444356ead65e9210e93a1586cb6290b3a6e
  "Please choose the addressbook" => "Choisissez le carnet d'adresses SVP",
  "create a new addressbook" => "Créer un nouveau carnet d'adresses",
  "Name of new addressbook" => "Nom du nouveau carnet d'adresses",
- "Import" => "Importer",
  "Importing contacts" => "Importation des contacts",
++"Contacts imported successfully" => "Contacts importés avec succes",
++"Close Dialog" => "Fermer la boite de dialogue",
++"Import Addressbook" => "Importer un carnet d'adresses.",
 +"Select address book to import to:" => "Selectionner le carnet d'adresses à importer vers:",
++"Drop a VCF file to import contacts." => "Glisser un fichier VCF pour importer des contacts.",
 +"Select from HD" => "Selectionner depuis le disque dur",
  "You have no contacts in your addressbook." => "Il n'y a pas de contact dans votre carnet d'adresses.",
  "Add contact" => "Ajouter un contact",
- "Configure addressbooks" => "Paramétrer carnet d'adresses",
+ "Select Address Books" => "Choix du carnet d'adresses",
+ "Enter name" => "Saisissez le nom",
+ "Enter description" => "Saisissez une description",
  "CardDAV syncing addresses" => "Synchronisation des contacts CardDAV",
  "more info" => "Plus d'infos",
  "Primary address (Kontact et al)" => "Adresse principale",
index f420b48d842b68161803036a98b99d6012f565c0,338ceb7154fe39014591126fed69157510b5de26..4d455f7c976570d47de5776ebbd2a68dd28dbc08
  "Please choose the addressbook" => "Per favor selige le adressario",
  "create a new addressbook" => "Crear un nove adressario",
  "Name of new addressbook" => "Nomine del nove gruppo:",
 +"Import" => "Importar",
++"Contacts imported successfully" => "Contactos importate con successo.",
++"Close Dialog" => "Clauder dialogo",
++"Import Addressbook" => "Importar adressario.",
  "Add contact" => "Adder adressario",
  "more info" => "plus info",
- "iOS/OS X" => "iOS/OS X"
+ "iOS/OS X" => "iOS/OS X",
+ "Download" => "Discargar",
+ "Edit" => "Modificar",
+ "New Address Book" => "Nove adressario",
+ "Save" => "Salveguardar",
+ "Cancel" => "Cancellar"
  );
index 2a5478e6c4b9ad6becb9a78e99f7b133a01018e9,99a793d74e48c9ee8f6d24de085acf48d5c17e4a..8302bfffdca38b09b3ccb3c7042e6ef3f756d543
  "Please choose the addressbook" => "Scegli la rubrica",
  "create a new addressbook" => "crea una nuova rubrica",
  "Name of new addressbook" => "Nome della nuova rubrica",
- "Import" => "Importa",
  "Importing contacts" => "Importazione contatti",
++"Contacts imported successfully" => "Contatti importati correttamente",
++"Close Dialog" => "Chiudi finestra",
++"Import Addressbook" => "Importa rubrica",
 +"Select address book to import to:" => "Seleziona la rubrica di destinazione:",
++"Drop a VCF file to import contacts." => "Rilascia un file VCF per importare i contatti.",
 +"Select from HD" => "Seleziona da disco",
  "You have no contacts in your addressbook." => "Non hai contatti nella rubrica.",
  "Add contact" => "Aggiungi contatto",
- "Configure addressbooks" => "Configura rubriche",
+ "Select Address Books" => "Seleziona rubriche",
+ "Enter name" => "Inserisci il nome",
+ "Enter description" => "Inserisci una descrizione",
  "CardDAV syncing addresses" => "Indirizzi di sincronizzazione CardDAV",
  "more info" => "altre informazioni",
  "Primary address (Kontact et al)" => "Indirizzo principale (Kontact e altri)",
index 2b81a5d877e9e74494f8610297c4814aba59289b,093b105777cc57da7553ae0c55ae070bdff22802..dbdd633e519b6c7f0437ba3d2a301da3d8093f55
  "Please choose the addressbook" => "Ве молам изберете адресар",
  "create a new addressbook" => "креирај нов адресар",
  "Name of new addressbook" => "Име на новиот адресар",
- "Import" => "Внеси",
  "Importing contacts" => "Внесување контакти",
++"Contacts imported successfully" => "Контаките беа внесени успешно",
++"Close Dialog" => "Дијалог за затварање",
++"Import Addressbook" => "Внеси адресар",
 +"Select address book to import to:" => "Изберете адресар да се внесе:",
++"Drop a VCF file to import contacts." => "Довлечкај VCF датотека да се внесат контакти.",
 +"Select from HD" => "Изберете од хард диск",
  "You have no contacts in your addressbook." => "Немате контакти во Вашиот адресар.",
  "Add contact" => "Додади контакт",
- "Configure addressbooks" => "Уреди адресари",
  "CardDAV syncing addresses" => "Адреса за синхронизација со CardDAV",
  "more info" => "повеќе информации",
  "Primary address (Kontact et al)" => "Примарна адреса",
index 3f7731bede86c12da32c8d621577ed06d5f2f222,905f6fc6a0d810e886e2637b9d8c22764ee319dc..5f7c49c8b9896015bff3d7ba302c5e0a505ae451
  "Ph.D." => "Stipendiat",
  "Jr." => "Jr.",
  "Sn." => "Sr.",
- "Submit" => "Lagre",
 +"New Addressbook" => "Ny adressebok",
 +"Edit Addressbook" => "Endre adressebok",
 +"Displayname" => "Visningsnavn",
 +"Active" => "Aktiv",
 +"Save" => "Lagre",
++"Submit" => "Send inn",
 +"Cancel" => "Avbryt",
  "Import a contacts file" => "Importer en fil med kontakter.",
  "Please choose the addressbook" => "Vennligst velg adressebok",
  "create a new addressbook" => "Lag ny adressebok",
index fd7e50ba4d58b6a1f06f6a403cb307c4880edc9b,ff499e92493f80211f75062ea80d626fcbdb2b35..bcf93c506a9889e1ce13084eea389fbb50fd92c5
  "Please choose the addressbook" => "Kies een adresboek",
  "create a new addressbook" => "Maak een nieuw adresboek",
  "Name of new addressbook" => "Naam van nieuw adresboek",
- "Import" => "Importeer",
  "Importing contacts" => "Importeren van contacten",
++"Contacts imported successfully" => "Contacten zijn geïmporteerd",
++"Close Dialog" => "Sluit venster",
++"Import Addressbook" => "Importeer adresboek",
 +"Select address book to import to:" => "Selecteer adresboek voor import:",
++"Drop a VCF file to import contacts." => "Sleep een VCF bestand om de contacten te importeren.",
 +"Select from HD" => "Selecteer van schijf",
  "You have no contacts in your addressbook." => "Je hebt geen contacten in je adresboek",
  "Add contact" => "Contactpersoon toevoegen",
- "Configure addressbooks" => "Bewerken adresboeken",
  "CardDAV syncing addresses" => "CardDAV synchroniseert de adressen",
  "more info" => "meer informatie",
  "Primary address (Kontact et al)" => "Standaardadres",
index 6e5ebe3bd3c6f79d3df8cd10e7d5b8e7093ac97e,8295b32a6f16c37721fde6105a5741175bda860d..54ae324d93c48294337733e6783fb0f870d04cd8
  "Please choose the addressbook" => "Prosím zvolte adresár",
  "create a new addressbook" => "vytvoriť nový adresár",
  "Name of new addressbook" => "Meno nového adresára",
- "Import" => "Importovať",
  "Importing contacts" => "Importovanie kontaktov",
++"Contacts imported successfully" => "Kontakty úspešne importované",
++"Close Dialog" => "Zatvoriť ponuku",
++"Import Addressbook" => "Importovanie adresára",
 +"Select address book to import to:" => "Vyberte adresár, do ktorého chcete importovať:",
++"Drop a VCF file to import contacts." => "Pretiahnite VCF súbor pre import kontaktov.",
 +"Select from HD" => "Vyberte z pevného disku",
  "You have no contacts in your addressbook." => "Nemáte žiadne kontakty v adresári.",
  "Add contact" => "Pridať kontakt",
- "Configure addressbooks" => "Nastaviť adresáre",
+ "Enter name" => "Zadaj meno",
  "CardDAV syncing addresses" => "Adresy pre synchronizáciu s CardDAV",
  "more info" => "viac informácií",
  "Primary address (Kontact et al)" => "Predvolená adresa (Kontakt etc)",
index bfba23fabcf4a79bc7f290f451fe7ae0c2dc2569,0ed9766aa327b7eebcadf501d02fb2c2ed02dfd6..e404b7a5e9430ea9217ee60717c0f69a7b5ea8ae
  "Please choose the addressbook" => "Prosimo, če izberete imenik",
  "create a new addressbook" => "Ustvari nov imenik",
  "Name of new addressbook" => "Ime novega imenika",
- "Import" => "Uvozi",
  "Importing contacts" => "Uvažam stike",
++"Contacts imported successfully" => "Stiki so bili uspešno uvoženi",
++"Close Dialog" => "Zapri dialog",
++"Import Addressbook" => "Uvozi imenik",
 +"Select address book to import to:" => "Izberite imenik v katerega boste uvažali:",
++"Drop a VCF file to import contacts." => "Za uvoz stikov spustite VCF datoteko tukaj.",
 +"Select from HD" => "Izberi iz HD",
  "You have no contacts in your addressbook." => "V vašem imeniku ni stikov.",
  "Add contact" => "Dodaj stik",
- "Configure addressbooks" => "Nastavi imenike",
+ "Select Address Books" => "Izberite adresarje",
+ "Enter name" => "Vnesite ime",
+ "Enter description" => "Vnesite opis",
  "CardDAV syncing addresses" => "CardDAV naslovi za sinhronizacijo",
  "more info" => "več informacij",
  "Primary address (Kontact et al)" => "Primarni naslov (za kontakt et al)",
index acf382c6a43a164a2e660932eb8ede8a66de2f91,facdd62b7b53e263346aa06e1045e25b1cca4020..6afc64e61d315f1b212ddef904272f960ec5c20f
  "Please choose the addressbook" => "กรุณาเลือกสมุดบันทึกที่อยู่",
  "create a new addressbook" => "สร้างสมุดบันทึกที่อยู่ใหม่",
  "Name of new addressbook" => "กำหนดชื่อของสมุดที่อยู่ที่สร้างใหม่",
- "Import" => "นำเข้า",
  "Importing contacts" => "นำเข้าข้อมูลการติดต่อ",
++"Contacts imported successfully" => "ข้อมูลการติดต่อถูกนำเข้าข้อมูลเรียบร้อยแล้ว",
++"Close Dialog" => "ปิดกล่องข้อความ",
++"Import Addressbook" => "นำเข้าข้อมูลสมุดบันทึกที่อยู่",
 +"Select address book to import to:" => "เลือกสมุดบันทึกที่อยู่ที่ต้องการนำเข้า:",
++"Drop a VCF file to import contacts." => "วางไฟล์ VCF ที่ต้องการนำเข้าข้อมูลการติดต่อ",
 +"Select from HD" => "เลือกจากฮาร์ดดิส",
  "You have no contacts in your addressbook." => "คุณยังไม่มีข้อมูลการติดต่อใดๆในสมุดบันทึกที่อยู่ของคุณ",
  "Add contact" => "เพิ่มชื่อผู้ติดต่อ",
- "Configure addressbooks" => "กำหนดค่าสมุดบันทึกที่อยู่",
+ "Select Address Books" => "เลือกสมุดบันทึกที่อยู่",
+ "Enter name" => "กรอกชื่อ",
+ "Enter description" => "กรอกคำอธิบาย",
  "CardDAV syncing addresses" => "ที่อยู่ที่ใช้เชื่อมข้อมูลกับ CardDAV",
  "more info" => "ข้อมูลเพิ่มเติม",
  "Primary address (Kontact et al)" => "ที่อยู่หลัก (สำหรับติดต่อ)",
index 65e8e34c30595146a07d56e7f00f608e18770d58,3abe96998eda8cc6765a117bbb909d07d5ea5d48..e2a769410f1c888315b74e990bfb253eecf794c0
  "Please choose the addressbook" => "Yeni adres defterini seç",
  "create a new addressbook" => "Yeni adres defteri oluştur",
  "Name of new addressbook" => "Yeni adres defteri için isim",
- "Import" => "İçe aktar",
  "Importing contacts" => "Bağlantıları içe aktar",
++"Contacts imported successfully" => "Bağlantılar başarıyla içe aktarıldı",
++"Close Dialog" => "Diyaloğu kapat",
++"Import Addressbook" => "Adres defterini içeri aktar",
 +"Select address book to import to:" => "İçe aktarılacak adres defterini seçin:",
++"Drop a VCF file to import contacts." => "Bağlantıları içe aktarmak için bir VCF dosyası bırakın.",
 +"Select from HD" => "HD'den seç",
  "You have no contacts in your addressbook." => "Adres defterinizde hiç bağlantı yok.",
  "Add contact" => "Bağlatı ekle",
- "Configure addressbooks" => "Adres defterini yapılandır",
+ "Select Address Books" => "Adres deftelerini seçiniz",
+ "Enter name" => "İsim giriniz",
+ "Enter description" => "Tanım giriniz",
  "CardDAV syncing addresses" => "CardDAV adresleri eşzamanlıyor",
  "more info" => "daha fazla bilgi",
  "Primary address (Kontact et al)" => "Birincil adres (Bağlantı ve arkadaşları)",
index d4c2efc47aa30be1bcd7db002684e69c6b21a847,c8edacec9e90068a1a0b7656bc4c999dccaa235b..0d007ef9c82cc833d1efacfc62464f99cc5ef6df
@@@ -3,25 -6,12 +6,16 @@@
  "There was an error adding the contact." => "添加通訊錄發生錯誤",
  "Cannot add empty property." => "不可添加空白內容",
  "At least one of the address fields has to be filled out." => "至少必須填寫一欄地址",
- "No contacts found." => "沒有找到聯絡人",
- "Missing ID" => "遺失ID",
 +"Error adding contact property." => "添加通訊錄內容中發生錯誤",
 +"No ID provided" => "未提供 ID",
 +"Error adding addressbook." => "添加電話簿中發生錯誤",
 +"Error activating addressbook." => "啟用電話簿中發生錯誤",
  "Information about vCard is incorrect. Please reload the page." => "有關 vCard 的資訊不正確,請重新載入此頁。",
- "Error deleting contact property." => "刪除通訊錄內容中發生錯誤",
- "Error updating contact property." => "更新通訊錄內容中發生錯誤",
- "Error updating addressbook." => "電話簿更新中發生錯誤",
+ "Missing ID" => "遺失ID",
  "No file was uploaded" => "沒有已上傳的檔案",
  "Contacts" => "通訊錄",
- "Addressbook not found." => "找不到通訊錄",
  "This is not your addressbook." => "這不是你的電話簿",
  "Contact could not be found." => "通訊錄未發現",
- "Address" => "地址",
- "Telephone" => "電話",
- "Email" => "電子郵件",
- "Organization" => "組織",
  "Work" => "公司",
  "Home" => "住宅",
  "Mobile" => "行動電話",
index 974ecb4047d624f841cf70fb6ec01e0cb82607d1,810c681fe5108093155cacaf3a1980c02efa67fc..b487260d32756c69ee1a7fd97ce8d1761697b379
@@@ -41,17 -41,34 +41,34 @@@ class OC_Contacts_Addressbook 
        /**
         * @brief Returns the list of addressbooks for a specific user.
         * @param string $uid
-        * @return array
+        * @param boolean $active Only return addressbooks with this $active state, default(=false) is don't care
+        * @return array or false.
         */
-       public static function all($uid){
-               $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ORDER BY `displayname`' );
-               $result = $stmt->execute(array($uid));
+       public static function all($uid, $active=false) {
+               $values = array($uid);
+               $active_where = '';
+               if ($active) {
 -                      $active_where = ' AND active = ?';
++                      $active_where = ' AND `active` = ?';
+                       $values[] = 1;
+               }
+               try {
 -                      $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE userid = ? ' . $active_where . ' ORDER BY displayname' );
++                      $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ' . $active_where . ' ORDER BY `displayname`' );
+                       $result = $stmt->execute($values);
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' uid: '.$uid, OCP\Util::DEBUG);
+                       return false;
+               }
  
                $addressbooks = array();
-               while( $row = $result->fetchRow()){
+               while( $row = $result->fetchRow()) {
                        $addressbooks[] = $row;
                }
+               $addressbooks = array_merge($addressbooks, OCP\Share::getItemsSharedWith('addressbook', OC_Share_Backend_Addressbook::FORMAT_ADDRESSBOOKS));
+               if(!$active && !count($addressbooks)) {
+                       $id = self::addDefault($uid);
+                       return array(self::find($id),);
+               }
                return $addressbooks;
        }
  
        /**
         * @brief Gets the data of one address book
         * @param integer $id
-        * @return associative array
+        * @return associative array or false.
         */
-       public static function find($id){
+       public static function find($id) {
                try {
 -                      $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE id = ?' );
 +                      $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' );
                        $result = $stmt->execute(array($id));
 +                      return $result->fetchRow();
                } catch(Exception $e) {
                        OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
                        OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG);
         * @param string $description
         * @return insertid
         */
-       public static function add($userid,$name,$description=''){
-               $all = self::all($userid);
+       public static function add($uid,$name,$description='') {
+               try {
 -                      $stmt = OCP\DB::prepare( 'SELECT uri FROM *PREFIX*contacts_addressbooks WHERE userid = ? ' );
++                      $stmt = OCP\DB::prepare( 'SELECT `uri` FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ' );
+                       $result = $stmt->execute(array($uid));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' uid: '.$uid, OCP\Util::DEBUG);
+                       return false;
+               }
                $uris = array();
-               foreach($all as $i){
-                       $uris[] = $i['uri'];
+               while($row = $result->fetchRow()){
+                       $uris[] = $row['uri'];
                }
  
                $uri = self::createURI($name, $uris );
-               $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)' );
-               $result = $stmt->execute(array($userid,$name,$uri,$description,1));
+               try {
 -                      $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' );
++                      $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)' );
+                       $result = $stmt->execute(array($uid,$name,$uri,$description,1));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uid: '.$uid, OCP\Util::DEBUG);
+                       return false;
+               }
  
                return OCP\DB::insertid('*PREFIX*contacts_addressbooks');
        }
         * @param string $uri
         * @param string $name
         * @param string $description
-        * @return insertid
+        * @return insertid or false
         */
-       public static function addFromDAVData($principaluri,$uri,$name,$description){
-               $userid = self::extractUserID($principaluri);
+       public static function addFromDAVData($principaluri,$uri,$name,$description) {
+               $uid = self::extractUserID($principaluri);
  
-               $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)' );
-               $result = $stmt->execute(array($userid,$name,$uri,$description,1));
+               try {
 -                      $stmt = OCP\DB::prepare('INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)');
++                      $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)');
+                       $result = $stmt->execute(array($uid,$name,$uri,$description,1));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uid: '.$uid, OCP\Util::DEBUG);
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uri: '.$uri, OCP\Util::DEBUG);
+                       return false;
+               }
  
                return OCP\DB::insertid('*PREFIX*contacts_addressbooks');
        }
         * @param string $description
         * @return boolean
         */
-       public static function edit($id,$name,$description){
+       public static function edit($id,$name,$description) {
                // Need these ones for checking uri
                $addressbook = self::find($id);
-               if(is_null($name)){
-                       $name = $addressbook['name'];
-               }
-               if(is_null($description)){
-                       $description = $addressbook['description'];
-               }
-               $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_addressbooks` SET `displayname`=?,`description`=?, `ctag`=`ctag`+1 WHERE `id`=?' );
-               $result = $stmt->execute(array($name,$description,$id));
-               return true;
-       }
-       public static function cleanArray($array, $remove_null_number = true){
-               $new_array = array();
-               $null_exceptions = array();
-               foreach ($array as $key => $value){
-                       $value = trim($value);
-                       if($remove_null_number){
-                               $null_exceptions[] = '0';
-                       }
-                       if(!in_array($value, $null_exceptions) && $value != "") {
-                               $new_array[] = $value;
+               if ($addressbook['userid'] != OCP\User::getUser()) {
+                       $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id);
+                       if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) {
+                               return false;
                        }
                }
-               return $new_array;
-       }
-       /**
-        * @brief Get active addressbooks for a user.
-        * @param integer $uid User id. If null current user will be used.
-        * @return array
-        */
-       public static function activeIds($uid = null){
-               if(is_null($uid)){
-                       $uid = OCP\USER::getUser();
-               }
-               $prefbooks = OCP\Config::getUserValue($uid,'contacts','openaddressbooks',null);
-               $prefbooks = explode(';',$prefbooks);
-               for ($i = 0; $i < count($prefbooks); $i++) {
-                       if(!$prefbooks[$i] || !self::find($prefbooks[$i])) {
-                               unset($prefbooks[$i]);
-                       }
+               if(is_null($name)) {
+                       $name = $addressbook['name'];
                }
-               if(!$prefbooks){
-                       OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:activeIds:, No active addressbooks',OCP\Util::DEBUG);
-                       $addressbooks = OC_Contacts_Addressbook::all($uid);
-                       if(count($addressbooks) == 0){
-                               OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:activeIds:, No addressbooks',OCP\Util::DEBUG);
-                               $id = self::add($uid,'default','Default Address Book');
-                               OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:activeIds:, Created addressbook: '.$id,OCP\Util::DEBUG);
-                               self::setActive($id, true);
-                               $addressbooks = OC_Contacts_Addressbook::all($uid);
-                       }
-                       $prefbooks[] = $addressbooks[0]['id'];
-                       OCP\Config::setUserValue($uid,'contacts','openaddressbooks',implode(';',$prefbooks));
+               if(is_null($description)) {
+                       $description = $addressbook['description'];
                }
-               return $prefbooks;
-       }
  
-       /**
-        * @brief Returns the list of active addressbooks for a specific user.
-        * @param string $uid
-        * @return array
-        */
-       public static function active($uid){
-               $active = self::activeIds($uid);
-               $addressbooks = array();
-               if(!$active) {
-                       return $addressbooks;
-               }
-               $ids_sql = join(',', array_fill(0, count($active), '?'));
-               $prep = 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `id` IN ('.$ids_sql.') ORDER BY `displayname`';
                try {
-                       $stmt = OCP\DB::prepare( $prep );
-                       $result = $stmt->execute($active);
-                       while( $row = $result->fetchRow()){
-                               $addressbooks[] = $row;
-                       }
 -                      $stmt = OCP\DB::prepare('UPDATE *PREFIX*contacts_addressbooks SET displayname=?,description=?, ctag=ctag+1 WHERE id=?');
++                      $stmt = OCP\DB::prepare('UPDATE `*PREFIX*contacts_addressbooks` SET `displayname`=?,`description`=?, `ctag`=`ctag`+1 WHERE `id`=?');
+                       $result = $stmt->execute(array($name,$description,$id));
                } catch(Exception $e) {
-                       OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:active:, exception: '.$e->getMessage(),OCP\Util::DEBUG);
-                       OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:active, ids: '.join(',', $active),OCP\Util::DEBUG);
-                       OCP\Util::writeLog('contacts','OC_Contacts_Addressbook::active, SQL:'.$prep,OCP\Util::DEBUG);
-                       return array();
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG);
+                       return false;
                }
  
-               return $addressbooks;
+               return true;
        }
  
        /**
         * @brief Activates an addressbook
         * @param integer $id
-        * @param integer $name
+        * @param boolean $active
         * @return boolean
         */
-       public static function setActive($id,$active=true){
-               // Need these ones for checking uri
-               //$addressbook = self::find($id);
-               if(is_null($id)){
-                       $id = 0;
-               }
-               $openaddressbooks = self::activeIds();
-               if($active) {
-                       if(!in_array($id, $openaddressbooks)) {
-                               $openaddressbooks[] = $id;
-                       }
-               } else {
-                       if(in_array($id, $openaddressbooks)) {
-                               unset($openaddressbooks[array_search($id, $openaddressbooks)]);
-                       }
+       public static function setActive($id,$active) {
 -              $sql = 'UPDATE *PREFIX*contacts_addressbooks SET active = ? WHERE id = ?';
++              $sql = 'UPDATE `*PREFIX*contacts_addressbooks` SET `active` = ? WHERE `id` = ?';
+               OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id.', active: '.intval($active), OCP\Util::ERROR);
+               try {
+                       $stmt = OCP\DB::prepare($sql);
+                       $stmt->execute(array(intval($active), $id));
+                       return true;
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception for '.$id.': '.$e->getMessage(), OCP\Util::ERROR);
+                       return false;
                }
-               // NOTE: Ugly hack...
-               $openaddressbooks = self::cleanArray($openaddressbooks, false);
-               sort($openaddressbooks, SORT_NUMERIC);
-               // FIXME: I alway end up with a ';' prepending when imploding the array..?
-               OCP\Config::setUserValue(OCP\USER::getUser(),'contacts','openaddressbooks',implode(';', $openaddressbooks));
-               return true;
        }
  
        /**
         * @param integer $id ID of the address book.
         * @return boolean
         */
-       public static function isActive($id){
-               //OCP\Util::writeLog('contacts','OC_Contacts_Addressbook::isActive('.$id.'):'.in_array($id, self::activeIds()), OCP\Util::DEBUG);
-               return in_array($id, self::activeIds());
+       public static function isActive($id) {
 -              $sql = 'SELECT active FROM *PREFIX*contacts_addressbooks WHERE id = ?';
++              $sql = 'SELECT `active` FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?';
+               try {
+                       $stmt = OCP\DB::prepare( $sql );
+                       $result = $stmt->execute(array($id));
+                       $row = $result->fetchRow();
+                       return (bool)$row['active'];
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+               }
        }
  
        /**
         * @param integer $id
         * @return boolean
         */
-       public static function delete($id){
-               // FIXME: There's no error checking at all.
+       public static function delete($id) {
+               $addressbook = self::find($id);
+               if ($addressbook['userid'] != OCP\User::getUser()) {
+                       $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id);
+                       if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_DELETE)) {
+                               return false;
+                       }
+               }
                self::setActive($id, false);
-               $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' );
-               $stmt->execute(array($id));
+               try {
 -                      $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE id = ?' );
++                      $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' );
+                       $stmt->execute(array($id));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception for '.$id.': '.$e->getMessage(), OCP\Util::ERROR);
+                       return false;
+               }
  
                $cards = OC_Contacts_VCard::all($id);
                foreach($cards as $card){
         * @param integer $id
         * @return boolean
         */
-       public static function touch($id){
+       public static function touch($id) {
 -              $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET ctag = ctag + 1 WHERE id = ?' );
 +              $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_addressbooks` SET `ctag` = `ctag` + 1 WHERE `id` = ?' );
                $stmt->execute(array($id));
  
                return true;
index 3afad1ef7d332e2e841f2a882c261484ffa9f89c,3344e3d6939a4dc936367bfb0df006551cb31c7c..8b7adc60f272a305faccbab986e8cedf21c59ded
@@@ -30,10 -39,10 +39,10 @@@ class OC_Contacts_Hooks
         * @return array
         */
        static public function createUser($parameters) {
-               OC_Contacts_Addressbook::add($parameters['uid'],'default','Default Address Book');
+               OC_Contacts_Addressbook::addDefault($parameters['uid']);
                return true;
        }
 -      
 +
        /**
         * @brief Deletes all Addressbooks of a certain user
         * @param paramters parameters from postDeleteUser-Hook
index a0491c6323cc6b633193ac6bae92ed6adc5ded96,4c66a538a27e981427037337f92ec301a191e536..fbb1c734f648ce58de5da62f84ae78cfbf2b3d33
@@@ -47,36 -47,40 +47,41 @@@ class OC_Contacts_VCard 
         * The cards are associative arrays. You'll find the original vCard in
         * ['carddata']
         */
-       public static function all($id){
+       public static function all($id, $start=null, $num=null){
++              //FIXME jfd: use limit & offset as OC_DB::prepare parameters for oracle support
+               $limitsql = '';
+               if(!is_null($num)) {
+                       $limitsql = ' LIMIT '.$num;
+               }
+               if(!is_null($start) && !is_null($num)) {
+                       $limitsql .= ' OFFSET '.$start.' ';
+               }
                $result = null;
-               if(is_array($id) && count($id) > 1) {
+               if(is_array($id) && count($id)) {
                        $id_sql = join(',', array_fill(0, count($id), '?'));
-                       $prep = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` IN ('.$id_sql.') ORDER BY `fullname`';
 -                      $prep = 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid IN ('.$id_sql.') ORDER BY fullname '.$limitsql;
++                      $prep = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` IN ('.$id_sql.') ORDER BY `fullname`'.$limitsql;
                        try {
                                $stmt = OCP\DB::prepare( $prep );
                                $result = $stmt->execute($id);
                        } catch(Exception $e) {
-                               OCP\Util::writeLog('contacts','OC_Contacts_VCard:all:, exception: '.$e->getMessage(),OCP\Util::ERROR);
-                               OCP\Util::writeLog('contacts','OC_Contacts_VCard:all, ids: '.count($id).' '.join(',', $id),OCP\Util::DEBUG);
-                               OCP\Util::writeLog('contacts','SQL:'.$prep,OCP\Util::DEBUG);
-                       }
-               } elseif($id) {
-                       if(is_array($id)) {
-                               if(count($id) == 0) {
-                                       return array();
-                               }
-                               $id = $id[0];
+                               OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                               OCP\Util::writeLog('contacts', __METHOD__.', ids: '.join(',', $id), OCP\Util::DEBUG);
+                               OCP\Util::writeLog('contacts', __METHOD__.'SQL:'.$prep, OCP\Util::DEBUG);
+                               return false;
                        }
+               } elseif(is_int($id) || is_string($id)) {
                        try {
-                               $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? ORDER BY `fullname`' );
 -                              $sql = 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? ORDER BY fullname'.$limitsql;
++                              $sql = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? ORDER BY `fullname`'.$limitsql;
+                               $stmt = OCP\DB::prepare( $sql );
                                $result = $stmt->execute(array($id));
                        } catch(Exception $e) {
-                               OCP\Util::writeLog('contacts','OC_Contacts_VCard:all:, exception: '.$e->getMessage(),OCP\Util::ERROR);
-                               OCP\Util::writeLog('contacts','OC_Contacts_VCard:all, id: '. $id,OCP\Util::DEBUG);
+                               OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                               OCP\Util::writeLog('contacts', __METHOD__.', ids: '. $id, OCP\Util::DEBUG);
+                               return false;
                        }
                } else {
-                       OCP\Util::writeLog('contacts','OC_Contacts_VCard:all: No ID given.',OCP\Util::ERROR);
-                       return array();
+                       OCP\Util::writeLog('contacts', __METHOD__.'. Addressbook id(s) argument is empty: '. print_r($id, true), OCP\Util::DEBUG);
+                       return false;
                }
                $cards = array();
                if(!is_null($result)) {
        /**
         * @brief Returns a card
         * @param integer $id
-        * @return associative array
+        * @return associative array or false.
         */
        public static function find($id){
-               $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `id` = ?' );
-               $result = $stmt->execute(array($id));
+               try {
 -                      $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE id = ?' );
++                      $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `id` = ?' );
+                       $result = $stmt->execute(array($id));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __METHOD__.', id: '. $id, OCP\Util::DEBUG);
+                       return false;
+               }
  
                return $result->fetchRow();
        }
         * @brief finds a card by its DAV Data
         * @param integer $aid Addressbook id
         * @param string $uri the uri ('filename')
-        * @return associative array
+        * @return associative array or false.
         */
        public static function findWhereDAVDataIs($aid,$uri){
-               $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' );
-               $result = $stmt->execute(array($aid,$uri));
+               try {
 -                      $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' );
++                      $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' );
+                       $result = $stmt->execute(array($aid,$uri));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG);
+                       return false;
+               }
  
                return $result->fetchRow();
        }
        * @returns true if the UID has been changed.
        */
        protected static function trueUID($aid, &$uid) {
 -              $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' );
 +              $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' );
                $uri = $uid.'.vcf';
-               $result = $stmt->execute(array($aid,$uri));
-               if($result->numRows() > 0){
+               try {
+                       $result = $stmt->execute(array($aid,$uri));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uid'.$uid, OCP\Util::DEBUG);
+                       return false;
+               }
+               if($result->numRows() > 0) {
                        while(true) {
-                               $tmpuid = substr(md5(rand().time()),0,10);
+                               $tmpuid = substr(md5(rand().time()), 0, 10);
                                $uri = $tmpuid.'.vcf';
-                               $result = $stmt->execute(array($aid,$uri));
-                               if($result->numRows() > 0){
+                               $result = $stmt->execute(array($aid, $uri));
+                               if($result->numRows() > 0) {
                                        continue;
                                } else {
                                        $uid = $tmpuid;
                }
  
                $data = $card->serialize();
 -              $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' );
 +              $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_cards` (`addressbookid`,`fullname`,`carddata`,`uri`,`lastmodified`) VALUES(?,?,?,?,?)' );
-               $result = $stmt->execute(array($aid,$fn,$data,$uri,time()));
+               try {
+                       $result = $stmt->execute(array($aid,$fn,$data,$uri,time()));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG);
+                       return false;
+               }
                $newid = OCP\DB::insertid('*PREFIX*contacts_cards');
  
                OC_Contacts_Addressbook::touch($aid);
                $card->setString('REV', $now->format(DateTime::W3C));
  
                $data = $card->serialize();
 -              $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' );
 +              $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `fullname` = ?,`carddata` = ?, `lastmodified` = ? WHERE `id` = ?' );
-               $result = $stmt->execute(array($fn,$data,time(),$id));
+               try {
+                       $result = $stmt->execute(array($fn,$data,time(),$id));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __METHOD__.', exception: '
+                               . $e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __METHOD__.', id'.$id, OCP\Util::DEBUG);
+                       return false;
+               }
  
                OC_Contacts_Addressbook::touch($oldcard['addressbookid']);
+               OC_Hook::emit('OC_Contacts_VCard', 'post_updateVCard', $id);
                return true;
        }
  
         * @return boolean
         */
        public static function delete($id){
-               // FIXME: Add error checking.
-               $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_cards` WHERE `id` = ?' );
-               $stmt->execute(array($id));
+               $card = self::find($id);
+               if (!$card) {
+                       return false;
+               }
+               $addressbook = OC_Contacts_Addressbook::find($card['addressbookid']);
+               if ($addressbook['userid'] != OCP\User::getUser()) {
+                       $sharedContact = OCP\Share::getItemSharedWithBySource('contact',
+                               $id, OCP\Share::FORMAT_NONE, null, true);
+                       if (!$sharedContact
+                               || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) {
+                               throw new Exception(
+                                       OC_Contacts_App::$l10n->t(
+                                               'You do not have the permissions to delete this contact.'
+                                       )
+                               );
+                       }
+               }
+               OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard',
+                       array('aid' => null, 'id' => $id, 'uri' => null)
+               );
 -              $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*contacts_cards WHERE id = ?');
++              $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*contacts_cards` WHERE `id` = ?');
+               try {
+                       $stmt->execute(array($id));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __METHOD__.
+                               ', exception: ' . $e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __METHOD__.', id: '
+                               . $id, OCP\Util::DEBUG);
+                       return false;
+               }
  
                return true;
        }
         * @return boolean
         */
        public static function deleteFromDAVData($aid,$uri){
-               // FIXME: Add error checking. Deleting a card gives an Kontact/Akonadi error.
+               $addressbook = OC_Contacts_Addressbook::find($aid);
+               if ($addressbook['userid'] != OCP\User::getUser()) {
+                       $query = OCP\DB::prepare( 'SELECT id FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' );
+                       $id = $query->execute(array($aid, $uri))->fetchOne();
+                       if (!$id) {
+                               return false;
+                       }
+                       $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true);
+                       if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) {
+                               return false;
+                       }
+               }
+               OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', array('aid' => $aid, 'id' => null, 'uri' => $uri));
 -              $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri=?' );
 +              $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri`=?' );
-               $stmt->execute(array($aid,$uri));
+               try {
+                       $stmt->execute(array($aid,$uri));
+               } catch(Exception $e) {
+                       OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR);
+                       OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri: '.$uri, OCP\Util::DEBUG);
+                       return false;
+               }
                OC_Contacts_Addressbook::touch($aid);
  
                return true;
         * @return boolean
         *
         */
-       public static function moveToAddressBook($aid, $id){
+       public static function moveToAddressBook($aid, $id, $isAddressbook = false) {
                OC_Contacts_App::getAddressbook($aid); // check for user ownership.
+               $addressbook = OC_Contacts_Addressbook::find($aid);
+               if ($addressbook['userid'] != OCP\User::getUser()) {
+                       $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $aid);
+                       if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_CREATE)) {
+                               return false;
+                       }
+               }
                if(is_array($id)) {
+                       foreach ($id as $index => $cardId) {
+                               $card = self::find($cardId);
+                               if (!$card) {
+                                       unset($id[$index]);
+                               }
+                               $oldAddressbook = OC_Contacts_Addressbook::find($card['addressbookid']);
+                               if ($oldAddressbook['userid'] != OCP\User::getUser()) {
+                                       $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $cardId, OCP\Share::FORMAT_NONE, null, true);
+                                       if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) {
+                                               unset($id[$index]);
+                                       }
+                               }
+                       }
                        $id_sql = join(',', array_fill(0, count($id), '?'));
 -                      $prep = 'UPDATE *PREFIX*contacts_cards SET addressbookid = ? WHERE id IN ('.$id_sql.')';
 +                      $prep = 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `id` IN ('.$id_sql.')';
                        try {
                                $stmt = OCP\DB::prepare( $prep );
                                //$aid = array($aid);
                                return false;
                        }
                } else {
-                       try {
+                       $stmt = null;
+                       if($isAddressbook) {
 -                              $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_cards SET addressbookid = ? WHERE addressbookid = ?' );
++                              $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `addressbookid` = ?' );
+                       } else {
+                               $card = self::find($id);
+                               if (!$card) {
+                                       return false;
+                               }
+                               $oldAddressbook = OC_Contacts_Addressbook::find($card['addressbookid']);
+                               if ($oldAddressbook['userid'] != OCP\User::getUser()) {
+                                       $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true);
+                                       if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) {
+                                               return false;
+                                       }
+                               }
 -                              $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_cards SET addressbookid = ? WHERE id = ?' );
 +                              $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `id` = ?' );
+                       }
+                       try {
                                $result = $stmt->execute(array($aid, $id));
                        } catch(Exception $e) {
-                               OCP\Util::writeLog('contacts','OC_Contacts_VCard::moveToAddressBook:, exception: '.$e->getMessage(),OCP\Util::DEBUG);
-                               OCP\Util::writeLog('contacts','OC_Contacts_VCard::moveToAddressBook, id: '.$id,OCP\Util::DEBUG);
+                               OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::DEBUG);
+                               OCP\Util::writeLog('contacts', __METHOD__.' id: '.$id, OCP\Util::DEBUG);
                                return false;
                        }
                }
index 91e748e30024d80e8c385d3bb19ddcf622cde5cb,52480ce7ff8d29226da6e2492009076b22a5ea8c..724152dc11d0fbb8ad9a8cdb2bb51b6f38846e20
@@@ -16,7 -17,6 +17,9 @@@
  "Nothing in here. Upload something!" => "لا يوجد شيء هنا. إرفع بعض الملفات!",
  "Name" => "الاسم",
  "Download" => "تحميل",
++"Size" => "حجم",
++"Modified" => "معدل",
 +"Delete" => "محذوف",
  "Upload too large" => "حجم الترفيع أعلى من المسموح",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم."
  );
index 83b360873108cbbd62c8e2581ba0f5a63ba245a7,624e08959feb8c14a5b035b4a058cb2086d2ecd1..89fc4544344481bc74bcf04480d4803914552860
@@@ -5,15 -5,30 +5,33 @@@
  "The uploaded file was only partially uploaded" => "Файлът е качен частично",
  "No file was uploaded" => "Фахлът не бе качен",
  "Missing a temporary folder" => "Липсва временната папка",
+ "Failed to write to disk" => "Грешка при запис на диска",
  "Files" => "Файлове",
+ "Delete" => "Изтриване",
+ "Upload Error" => "Грешка при качване",
+ "Upload cancelled." => "Качването е отменено.",
+ "Invalid name, '/' is not allowed." => "Неправилно име – \"/\" не е позволено.",
  "Size" => "Размер",
  "Modified" => "Променено",
+ "folder" => "папка",
+ "folders" => "папки",
+ "file" => "файл",
  "Maximum upload size" => "Макс. размер за качване",
+ "0 is unlimited" => "0 означава без ограничение",
+ "New" => "Нов",
+ "Text file" => "Текстов файл",
+ "Folder" => "Папка",
+ "From url" => "От url-адрес",
  "Upload" => "Качване",
+ "Cancel upload" => "Отказване на качването",
  "Nothing in here. Upload something!" => "Няма нищо, качете нещо!",
  "Name" => "Име",
+ "Share" => "Споделяне",
  "Download" => "Изтегляне",
++"Size" => "Размер",
++"Modified" => "Променено",
 +"Delete" => "Изтриване",
  "Upload too large" => "Файлът е прекалено голям",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файловете които се опитвате да качите са по-големи от позволеното за сървъра."
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файловете които се опитвате да качите са по-големи от позволеното за сървъра.",
+ "Files are being scanned, please wait." => "Файловете се претърсват, изчакайте."
  );
index baa6b3b7d458fc29dc2e3ab026ff1991ef1a9c5f,81bbfe03a0c7b113f43dd8594e84fdb64e0d0291..e48148421b871d3bc1b942512d1c9839e0a23e99
  "Name" => "Nom",
  "Share" => "Comparteix",
  "Download" => "Baixa",
++"Size" => "Mida",
++"Modified" => "Modificat",
++"Delete all" => "Esborra-ho tot",
 +"Delete" => "Suprimeix",
  "Upload too large" => "La pujada és massa gran",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor",
  "Files are being scanned, please wait." => "S'estan escanejant els fitxers, espereu",
index 9a4be26dadb9a4b71f79d1f48b763c2e92b7ac49,4dc4b8b0cb1d576f08fc4052a6ec760c9eb59cba..38f235343c3bf55cbd4298e5a88db9fa30490bc5
  "Name" => "Název",
  "Share" => "Sdílet",
  "Download" => "Stáhnout",
++"Size" => "Velikost",
++"Modified" => "Změněno",
++"Delete all" => "Smazat vše",
 +"Delete" => "Vymazat",
  "Upload too large" => "Příliš velký soubor",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Soubory, které se snažíte uložit, překračují maximální velikosti uploadu na tomto serveru.",
  "Files are being scanned, please wait." => "Soubory se prohledávají, prosím čekejte.",
index 3683ab8484d6584177a8bc60829d8bfe47015c02,56af0fa61d7b9e1020b97de006ac1801e32f3a52..8cefa27e64fc4a9cb83c2b2b23231c61a6f94368
@@@ -26,7 -44,6 +44,9 @@@
  "Name" => "Navn",
  "Share" => "Del",
  "Download" => "Download",
++"Size" => "Størrelse",
++"Modified" => "Ændret",
 +"Delete" => "Slet",
  "Upload too large" => "Upload for stor",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.",
  "Files are being scanned, please wait." => "Filerne bliver indlæst, vent venligst.",
index 9c5310c43b8609ee249219502ac4de28922bd6ce,5da3a997213032fec32508ad2434da2073637bfc..4a85912d31f79cc63b676de99b6fed835ebc531e
  "Name" => "Name",
  "Share" => "Teilen",
  "Download" => "Herunterladen",
++"Size" => "Größe",
++"Modified" => "Bearbeitet",
++"Delete all" => "Alle löschen",
 +"Delete" => "Löschen",
  "Upload too large" => "Upload zu groß",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
- "Files are being scanned, please wait." => "Daten werden gescannt, bitte warten.",
+ "Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten.",
  "Current scanning" => "Scannen"
  );
index 93be0246156ab40f5312c53c8284fc39cec76dca,3ab4b120949c1cbed6ba8f0992015c5f21e38a3e..4e93489fd39822fe74a6ac44dfe00713baebc836
  "Name" => "Όνομα",
  "Share" => "Διαμοίρασε",
  "Download" => "Λήψη",
++"Size" => "Μέγεθος",
++"Modified" => "Τροποποιήθηκε",
++"Delete all" => "Διαγραφή όλων",
 +"Delete" => "Διαγραφή",
  "Upload too large" => "Πολύ μεγάλο το αρχείο προς μεταφόρτωση",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος μεταφόρτωσης αρχείων σε αυτόν το διακομιστή.",
  "Files are being scanned, please wait." => "Τα αρχεία ανιχνεύονται, παρακαλώ περιμένετε",
index 64c380d600ffc0a7d53ea53f8d71f3a2a2722cfd,acaf06e830c5b55f16a5e7a344d55ea36e670719..2976a2127c390bb2ff74b58abfe6daa9f13928b1
  "Name" => "Nomo",
  "Share" => "Kunhavigi",
  "Download" => "Elŝuti",
++"Size" => "Grando",
++"Modified" => "Modifita",
++"Delete all" => "Forigi ĉion",
 +"Delete" => "Forigi",
  "Upload too large" => "Elŝuto tro larĝa",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.",
  "Files are being scanned, please wait." => "Dosieroj estas skanataj, bonvolu atendi.",
index 67bfb4702e83ccac9d80616974da4b2d105346fc,6cd51d60e2731257966bf635205deb89d420ee84..6fcf9086945f70376b417f8d4f1aeb055e66c7d7
  "Name" => "Nombre",
  "Share" => "Compartir",
  "Download" => "Descargar",
++"Size" => "Tamaño",
++"Modified" => "Modificado",
++"Delete all" => "Eliminar todo",
 +"Delete" => "Eliminado",
  "Upload too large" => "El archivo es demasiado grande",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido por este servidor.",
  "Files are being scanned, please wait." => "Se están escaneando los archivos, por favor espere.",
index 89bb96581c9486507a0f3f2a3ae39c739e63312b,a5dd345f8ebed34be05106e5106d4fdbc484886d..c455a8ffe6a0ae24ccaa4dbd01089d77c38c24da
  "Name" => "Nimi",
  "Share" => "Jaga",
  "Download" => "Lae alla",
++"Size" => "Suurus",
++"Modified" => "Muudetud",
++"Delete all" => "Kustuta kõik",
 +"Delete" => "Kustuta",
  "Upload too large" => "Üleslaadimine on liiga suur",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.",
  "Files are being scanned, please wait." => "Faile skannitakse, palun oota",
index a7ca21f496be96c45e8ddb8e585b3b0926b4ac55,d9c2689d1cdd43a2701ab0b08a1fe4b128081e4e..99c918e2209befb3d9c7ddb7735b608b66e88b32
  "Name" => "Izena",
  "Share" => "Elkarbanatu",
  "Download" => "Deskargatu",
++"Size" => "Tamaina",
++"Modified" => "Aldatuta",
++"Delete all" => "Ezabatu dena",
 +"Delete" => "Ezabatu",
  "Upload too large" => "Igotakoa handiegia da",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.",
  "Files are being scanned, please wait." => "Fitxategiak eskaneatzen ari da, itxoin mezedez.",
index 4bb46e1fcf90e9335426dab36f36b62e432f57f2,4dac88fc542283db0c287eb0e4b416517fe53dd1..78d8d776915bcca1f263b236e22c021d5be8a976
  "Name" => "نام",
  "Share" => "به اشتراک گذاری",
  "Download" => "بارگیری",
++"Size" => "اندازه",
++"Modified" => "تغییر یافته",
++"Delete all" => "پاک کردن همه",
 +"Delete" => "پاک کردن",
  "Upload too large" => "حجم بارگذاری بسیار زیاد است",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
  "Files are being scanned, please wait." => "پرونده ها در حال بازرسی هستند لطفا صبر کنید",
index ab2f4ea13dfaad8d2383f8cff18a734656a52ed2,6eb4341bd6eae3b36b2db7840f961f8a993ca4cc..9f9763636c7d598131f941b5661b2d9654c77ff7
  "Name" => "Nom",
  "Share" => "Partager",
  "Download" => "Téléchargement",
++"Size" => "Taille",
++"Modified" => "Modifié",
++"Delete all" => "Supprimer tout",
 +"Delete" => "Supprimer",
  "Upload too large" => "Fichier trop volumineux",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur.",
  "Files are being scanned, please wait." => "Les fichiers sont analysés, patientez svp.",
index 36eafaefe2738e788d5d165c4f720d41443814f5,3a36a23f0ca120c71677e72dcdebfd2503c0bca7..bf86fc9b809fabac9cbe995d7a0a0c6df35ae2e1
@@@ -26,7 -44,6 +44,9 @@@
  "Name" => "Nome",
  "Share" => "Compartir",
  "Download" => "Descargar",
++"Size" => "Tamaño",
++"Modified" => "Modificado",
 +"Delete" => "Eliminar",
  "Upload too large" => "Envío demasiado grande",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiros que trata de subir superan o tamaño máximo permitido neste servidor",
  "Files are being scanned, please wait." => "Estanse analizando os ficheiros, espere por favor.",
index 0876eb952c75c7634134f91bbc404d11ab14f8af,65d093e3662ca67c32d21a74ac81964a4fe0e297..5e3df214c4f2ebee7d08478ad0997e09b3d46151
@@@ -26,7 -37,6 +37,9 @@@
  "Name" => "שם",
  "Share" => "שיתוף",
  "Download" => "הורדה",
++"Size" => "גודל",
++"Modified" => "זמן שינוי",
 +"Delete" => "מחיקה",
  "Upload too large" => "העלאה גדולה מידי",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.",
  "Files are being scanned, please wait." => "הקבצים נסרקים, נא להמתין.",
index 3281d20a61d47a219773093d3ed2277b6a9e4e0b,7d5e61b3542113ca0d98fa80c19f2f81dff120ab..a3a6785294e5d0bd2b68e922c3b3e9df941a853f
@@@ -26,7 -37,6 +37,9 @@@
  "Name" => "Naziv",
  "Share" => "podjeli",
  "Download" => "Preuzmi",
++"Size" => "Veličina",
++"Modified" => "Zadnja promjena",
 +"Delete" => "Briši",
  "Upload too large" => "Prijenos je preobiman",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke koje pokušavate prenijeti prelaze maksimalnu veličinu za prijenos datoteka na ovom poslužitelju.",
  "Files are being scanned, please wait." => "Datoteke se skeniraju, molimo pričekajte.",
index 41255cb4096a484f2887dbc809311fe8b19d2c4e,8d52765e93e8cc8b37c06be90dac43257b9fe045..0a66cbda4a12f0b3663f6745af7a3e756fa660e1
  "Name" => "Név",
  "Share" => "Megosztás",
  "Download" => "Letöltés",
++"Size" => "Méret",
++"Modified" => "Módosítva",
++"Delete all" => "Mindent töröl",
 +"Delete" => "Törlés",
  "Upload too large" => "Feltöltés túl nagy",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlméretet ezen a szerveren.",
  "Files are being scanned, please wait." => "File-ok vizsgálata, kis türelmet",
index 645eba48a18b9adc71ce0bc39dec3dcdef0803b7,f9205cb5f641e255986bf474c39a5627c67005ba..40df7af98f4ce81c6893ea3ead9b3f1e2291707c
@@@ -12,6 -13,5 +13,8 @@@
  "Nothing in here. Upload something!" => "Nihil hic. Incarga alcun cosa!",
  "Name" => "Nomine",
  "Download" => "Discargar",
++"Size" => "Dimension",
++"Modified" => "Modificate",
 +"Delete" => "Deler",
  "Upload too large" => "Incargamento troppo longe"
  );
index 1f9dc3290aa29c820ecd08e8f4acda98c94973f4,47ce6429c9f3dc4fa5458a0924babbc6573fe097..c66f7861256bc5085434a454a891aea40c66d856
@@@ -24,7 -25,6 +25,9 @@@
  "Name" => "Nama",
  "Share" => "Bagikan",
  "Download" => "Unduh",
++"Size" => "Ukuran",
++"Modified" => "Dimodifikasi",
 +"Delete" => "Hapus",
  "Upload too large" => "Unggahan terlalu besar",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Berkas yang anda coba unggah melebihi ukuran maksimum untuk pengunggahan berkas di server ini.",
  "Files are being scanned, please wait." => "Berkas sedang dipindai, silahkan tunggu.",
index 82871826c186e0a6bf3ef09562ac49759955043c,6fda30a8f35cd8808518f7101530fa60d763aeeb..9bf02fb188d3ff588ab7aa7324a0c9918f2e24ed
  "Name" => "Nome",
  "Share" => "Condividi",
  "Download" => "Scarica",
++"Size" => "Dimensione",
++"Modified" => "Modificato",
++"Delete all" => "Elimina tutto",
 +"Delete" => "Elimina",
  "Upload too large" => "Il file caricato è troppo grande",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "I file che stai provando a caricare superano la dimensione massima consentita su questo server.",
  "Files are being scanned, please wait." => "Scansione dei file in corso, attendi",
index c04d0836dfb2201574312dc2d1bbdfb080ceaccc,8c19e45501289b50fe1ec3cf15bb32f9795d581a..868a2cfe70ca8f3825b063fbcd0cb0fa5b5e2cec
@@@ -26,7 -44,6 +44,9 @@@
  "Name" => "名前",
  "Share" => "共有",
  "Download" => "ダウンロード",
++"Size" => "サイズ",
++"Modified" => "更新日時",
 +"Delete" => "削除",
  "Upload too large" => "ファイルサイズが大きすぎます",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、サーバで規定された最大サイズを超えています。",
  "Files are being scanned, please wait." => "ファイルをスキャンしています、しばらくお待ちください。",
index 70575f0975d64e78ec84d27cf2c77f3bac67763e,218dd0ea2d7147e59fa83f80a88e49056dbb67d6..66b0c65d8c391f251d4b3e9d35ce8dc5009e2271
  "Name" => "이름",
  "Share" => "공유",
  "Download" => "다운로드",
++"Size" => "크기",
++"Modified" => "수정됨",
++"Delete all" => "모두 삭제",
 +"Delete" => "삭제",
  "Upload too large" => "업로드 용량 초과",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.",
  "Files are being scanned, please wait." => "파일을 검색중입니다, 기다려 주십시오.",
index 548ef4895d4733047924dc8fd31d1b3a89dbbf9f,f7a10fbc5cd06733567b3ce4f5a8ee02c80b2ef8..d3f1207cfba99a74189ae5143e278494b7570397
@@@ -26,7 -27,6 +27,9 @@@
  "Name" => "Numm",
  "Share" => "Share",
  "Download" => "Eroflueden",
++"Size" => "Gréisst",
++"Modified" => "Geännert",
 +"Delete" => "Läschen",
  "Upload too large" => "Upload ze grouss",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.",
  "Files are being scanned, please wait." => "Fichieren gi gescannt, war weg.",
index e876e743a48d9894764342a733973b545df29513,90b0314307401f49bdca8eb9ddb20e88ab53879f..9b2b364c9b8f82e88747cba9d2d4700f9a1e9bc0
  "Name" => "Pavadinimas",
  "Share" => "Dalintis",
  "Download" => "Atsisiųsti",
++"Size" => "Dydis",
++"Modified" => "Pakeista",
 +"Delete" => "Ištrinti",
  "Upload too large" => "Įkėlimui failas per didelis",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis viršija maksimalų leidžiamą šiame serveryje"
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis viršija maksimalų leidžiamą šiame serveryje",
+ "Files are being scanned, please wait." => "Skenuojami failai, prašome palaukti.",
+ "Current scanning" => "Šiuo metu skenuojama"
  );
index d3efa4d0225d5ada9b4fd8422d550f0c5fa7e6ad,4e1eccff255ced56dba721051753a9146cb05ba6..b060c087656c8cdabe271f85977af336835f798a
  "Name" => "Име",
  "Share" => "Сподели",
  "Download" => "Преземи",
++"Size" => "Големина",
++"Modified" => "Променето",
++"Delete all" => "Избриши сѐ",
 +"Delete" => "Избриши",
  "Upload too large" => "Датотеката е премногу голема",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
  "Files are being scanned, please wait." => "Се скенираат датотеки, ве молам почекајте.",
index 1a1d72a01b61f94291062c78a8b5eff0e9d0084b,de472a7c651f955aba76dec2c0635bdb44eca5d5..456a30a9d1a98a50fa1aa08f86a098cff8df078e
  "New" => "Baru",
  "Text file" => "Fail teks",
  "Folder" => "Folder",
+ "From url" => "Dari url",
  "Upload" => "Muat naik",
+ "Cancel upload" => "Batal muat naik",
  "Nothing in here. Upload something!" => "Tiada apa-apa di sini. Muat naik sesuatu!",
  "Name" => "Nama ",
+ "Share" => "Kongsi",
  "Download" => "Muat turun",
++"Size" => "Saiz",
++"Modified" => "Dimodifikasi",
 +"Delete" => "Padam",
  "Upload too large" => "Muat naik terlalu besar",
- "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server"
+ "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server",
+ "Files are being scanned, please wait." => "Fail sedang diimbas, harap bersabar.",
+ "Current scanning" => "Imbasan semasa"
  );
index 0f4cc33ae389ed2d9360242bd6be47f572b9df53,f02de12615a1ffdb5286724844867fa543d2fc5d..4a2bf36fd59aabd84bd7d4e208018cc643ce28f7
  "Name" => "Navn",
  "Share" => "Del",
  "Download" => "Last ned",
++"Size" => "Størrelse",
++"Modified" => "Endret",
++"Delete all" => "Slett alle",
 +"Delete" => "Slett",
  "Upload too large" => "Opplasting for stor",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er for store for å laste opp til denne serveren.",
  "Files are being scanned, please wait." => "Skanner etter filer, vennligst vent.",
index 119f6034f154436314715e2f0773f4cf2838626f,b093dc3ce12b7e1226f43e6e520dec2581f161e5..96b82d2481dbc1ba7486efb31b4969a152bbc7d0
  "Name" => "Naam",
  "Share" => "Delen",
  "Download" => "Download",
++"Size" => "Bestandsgrootte",
++"Modified" => "Laatst aangepast",
++"Delete all" => "Alles verwijderen",
 +"Delete" => "Verwijder",
  "Upload too large" => "Bestanden te groot",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane  bestandsgrootte voor deze server.",
  "Files are being scanned, please wait." => "Bestanden worden gescand, even wachten.",
index 002e85de5cc99501b7c1a53240d0b2acc9d6fd49,d6af73024947c6afce447268d3c2440cc78fda01..a2263b3df2f110e87689a79435a75c4443205186
@@@ -16,7 -17,6 +17,9 @@@
  "Nothing in here. Upload something!" => "Ingenting her. Last noko opp!",
  "Name" => "Namn",
  "Download" => "Last ned",
++"Size" => "Storleik",
++"Modified" => "Endra",
 +"Delete" => "Slett",
  "Upload too large" => "For stor opplasting",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er større enn maksgrensa til denne tenaren."
  );
index bfdd04659dd389a140b39960a540ec00926e458f,eb791330bfd24c444209f3788f83ed7ad57c77c8..7b67fd472247b43de90248dd23a788ff2994c571
@@@ -26,7 -44,6 +44,9 @@@
  "Name" => "Nazwa",
  "Share" => "Współdziel",
  "Download" => "Pobiera element",
++"Size" => "Rozmiar",
++"Modified" => "Czas modyfikacji",
 +"Delete" => "Usuwa element",
  "Upload too large" => "Wysyłany plik ma za duży rozmiar",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Pliki które próbujesz przesłać, przekraczają maksymalną, dopuszczalną wielkość.",
  "Files are being scanned, please wait." => "Skanowanie plików, proszę czekać.",
index b70406f517114a79656494fba9c55db1160a65c0,b783c37cb0399525e6f28beb490d5353be43d843..b606c8ef649e20215cbaa03da9f74c6e7a0ecf62
  "Name" => "Nome",
  "Share" => "Compartilhar",
  "Download" => "Baixar",
++"Size" => "Tamanho",
++"Modified" => "Modificado",
++"Delete all" => "Deletar Tudo",
 +"Delete" => "Excluir",
  "Upload too large" => "Arquivo muito grande",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor.",
  "Files are being scanned, please wait." => "Arquivos sendo escaneados, por favor aguarde.",
index ac2243028258f5452e9ec77cbf914de4b98e68e6,e413d7cbe7401e0813380c96a8024d22aa4ec9a1..eaf5a69a041b544c7632f817ccf91e2af05be847
@@@ -26,7 -44,6 +44,9 @@@
  "Name" => "Nome",
  "Share" => "Partilhar",
  "Download" => "Transferir",
++"Size" => "Tamanho",
++"Modified" => "Modificado",
 +"Delete" => "Apagar",
  "Upload too large" => "Envio muito grande",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiro que estás a tentar enviar excedem o tamanho máximo de envio neste servidor.",
  "Files are being scanned, please wait." => "Os ficheiros estão a ser analisados, por favor aguarde.",
index 2a7e84af6c49b5dbbfb1464b74a2ff030c53bbd6,8a31c550320ee09f999266c7aae97603d2517828..9e9a543d386bb2b74863e27fb3330a655a991871
@@@ -26,7 -37,6 +37,7 @@@
  "Name" => "Meno",
  "Share" => "Zdielať",
  "Download" => "Stiahnuť",
- "Delete" => "Odstrániť",
++"Delete all" => "Odstrániť všetko",
  "Upload too large" => "Nahrávanie príliš veľké",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Súbory ktoré sa snažíte nahrať presahujú maximálnu veľkosť pre nahratie súborov na tento server.",
  "Files are being scanned, please wait." => "Súbory sa práve prehľadávajú, prosím čakajte.",
index b0ea2dc373cda6a3d849faba0263ed03d764e688,f6322b2507d6dd1e87ee3f32bd9258edb3efe4a8..b94735c39159c41253b4dac137941eeaf0021a97
@@@ -25,8 -43,7 +43,8 @@@
  "Nothing in here. Upload something!" => "Tukaj ni ničesar. Naložite kaj!",
  "Name" => "Ime",
  "Share" => "Souporaba",
 -"Download" => "Prenesi",
 +"Download" => "Prejmi",
- "Delete" => "Izbriši",
++"Delete all" => "Izbriši vse",
  "Upload too large" => "Nalaganje ni mogoče, ker je preveliko",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke, ki jih želite naložiti, presegajo največjo dovoljeno velikost na tem strežniku.",
  "Files are being scanned, please wait." => "Preiskujem datoteke, prosimo počakajte.",
index ec538262e0228acb0edbfd7c128ac12368f368dc,eed9c36e132afb2056c5ce26b98ae1eca5eb2702..eca0e29a1821c23cd3044d0828f0557a466681f1
@@@ -26,7 -44,6 +44,7 @@@
  "Name" => "ชื่อ",
  "Share" => "แชร์",
  "Download" => "ดาวน์โหลด",
- "Delete" => "ลบ",
++"Delete all" => "ลบทั้งหมด",
  "Upload too large" => "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้",
  "Files are being scanned, please wait." => "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.",
index b8de8249a1d4411562c0d0f29a20ef49bf27ca0c,224322b24e0d0a71edd5714ee080ad778fa7e306..528eede66458595d615455f543c6b7509823a437
@@@ -26,7 -39,6 +39,7 @@@
  "Name" => "Ad",
  "Share" => "Paylaş",
  "Download" => "İndir",
- "Delete" => "Sil",
++"Delete all" => "Hepsini sil",
  "Upload too large" => "Yüklemeniz çok büyük",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu aşıyor.",
  "Files are being scanned, please wait." => "Dosyalar taranıyor, lütfen bekleyin.",
index c2e6541f2a235859e1461e557af88f5d7589b112,8ef7ff39c8b9204179db48993bd3221b7faf8c8d..c6fc9f907d6f6a769bb8314fe7248ff9af609e46
@@@ -26,7 -43,6 +43,7 @@@
  "Name" => "名称",
  "Share" => "共享",
  "Download" => "下载",
- "Delete" => "删除",
++"Delete all" => "删除所有",
  "Upload too large" => "上传文件过大",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "您正尝试上传的文件超过了此服务器可以上传的最大大小",
  "Files are being scanned, please wait." => "文件正在被扫描,请稍候。",
index 91a1344ca37a426090cd973900f03f5c58e9b5e3,bc8aa4ff892db500635f7a9618e6244c3902b07e..9151a4805dfe6163108b41ed682c5826b3907a3a
@@@ -26,7 -27,6 +27,7 @@@
  "Name" => "名稱",
  "Share" => "分享",
  "Download" => "下載",
- "Delete" => "刪除",
++"Delete all" => "全部刪除",
  "Upload too large" => "上傳過大",
  "The files you are trying to upload exceed the maximum size for file uploads on this server." => "你試圖上傳的檔案已超過伺服器的最大容量限制。 ",
  "Files are being scanned, please wait." => "正在掃描檔案,請稍等。",
Simple merge
Simple merge
index b9aa53562929bbea1e67ffa3153c64e230994824,701949d4d8077ba7f7f8098ec4ee9eb5ee52e565..d1b29a59928d614d4e22145c1e4868744bc93d12
@@@ -74,11 -74,11 +74,11 @@@ class OC_Gallery_Album 
                        $args[] = $path;
                }
                if (!is_null($parent)){
 -                      $sql .= ' AND parent_path = ?';
 +                      $sql .= ' AND `parent_path` = ?';
                        $args[] = $parent;
                }
-     $order = OCP\Config::getUserValue($owner, 'gallery', 'order', 'ASC');
+               $order = OCP\Config::getUserValue($owner, 'gallery', 'order', 'ASC');
 -              $sql .= ' ORDER BY album_name ' . $order;
 +              $sql .= ' ORDER BY `album_name` ' . $order;
  
                $stmt = OCP\DB::prepare($sql);
                return $stmt->execute($args);
        }
  
        public static function getAlbumSize($id){
 -              $sql = 'SELECT COUNT(*) as size FROM *PREFIX*gallery_photos WHERE album_id = ?';
 +              $sql = 'SELECT COUNT(*) AS `size` FROM `*PREFIX*gallery_photos` WHERE `album_id` = ?';
-     $stmt = OCP\DB::prepare($sql);
-     $result=$stmt->execute(array($id))->fetchRow();
-     return $result['size'];
+               $stmt = OCP\DB::prepare($sql);
+               $result=$stmt->execute(array($id))->fetchRow();
+               return $result['size'];
        }
  
-   public static function getIntermediateGallerySize($path) {
-     $path .= '%';
+       public static function getIntermediateGallerySize($path) {
+               $path .= '%';
 -              $sql = 'SELECT COUNT(*) as size FROM *PREFIX*gallery_photos photos, *PREFIX*gallery_albums albums WHERE photos.album_id = albums.album_id AND uid_owner = ? AND file_path LIKE ?';
 +              $sql = 'SELECT COUNT(*) AS `size` FROM `*PREFIX*gallery_photos` AS `photos`, `*PREFIX*gallery_albums` AS `albums` WHERE `photos`.`album_id` = `albums`.`album_id` AND `uid_owner` = ? AND `file_path` LIKE ?';
-     $stmt = OCP\DB::prepare($sql);
-     $result = $stmt->execute(array(OCP\USER::getUser(), $path))->fetchRow();
-     return $result['size'];
-   }
+               $stmt = OCP\DB::prepare($sql);
+               $result = $stmt->execute(array(OCP\USER::getUser(), $path))->fetchRow();
+               return $result['size'];
+       }
  }
- ?>
index 82356e54dda679997f097a3445b2f645e7391f68,575d962dbe3a196e2811850cb5b2e6d8d146e158..666c6d68931226bfcda582e9d3d056186a62b9f0
@@@ -14,6 -13,27 +13,27 @@@ class DatabaseManager 
                return self::$instance;
        }
        
 -              $stmt = \OCP\DB::prepare('SELECT * FROM *PREFIX*pictures_images_cache
 -                      WHERE uid_owner LIKE ? AND path like ? AND path not like ?');
+       protected function getPathData($path) {
 -              $stmt = \OCP\DB::prepare('INSERT INTO *PREFIX*pictures_images_cache (uid_owner, path, width, height) VALUES (?, ?, ?, ?)');
++              $stmt = \OCP\DB::prepare('SELECT * FROM `*PREFIX*pictures_images_cache`
++                      WHERE `uid_owner` LIKE ? AND `path` LIKE ? AND `path` NOT LIKE ?');
+               $path_match = $path.'/%';
+               $path_notmatch = $path.'/%/%';
+               $result = $stmt->execute(array(\OCP\USER::getUser(), $path_match, $path_notmatch));
+               $this->cache[$path] = array();
+               while (($row = $result->fetchRow()) != false) {
+                       $this->cache[$path][$row['path']] = $row;
+               }
+       }
+       public function setFileData($path, $width, $height) {
++              $stmt = \OCP\DB::prepare('INSERT INTO `*PREFIX*pictures_images_cache` (`uid_owner`, `path`, `width`, `height`) VALUES (?, ?, ?, ?)');
+               $stmt->execute(array(\OCP\USER::getUser(), $path, $width, $height));
+               $ret = array('path' => $path, 'width' => $width, 'height' => $height);
+               $dir = dirname($path);
+               $this->cache[$dir][$path] = $ret;
+               return $ret;
+       }
        public function getFileData($path) {
                $gallery_path = \OCP\Config::getSystemValue( 'datadirectory' ).'/'.\OC_User::getUser().'/gallery';
                $path = $gallery_path.$path;
index 1b4f908773ebc1d704efc61f58744fa251088e2d,3b4e74641b3af70df610ddd8d62ccfb0c35c2e84..f073ac9cbbb527fffa4a12d089bc246ed1f62988
@@@ -1,53 -1,55 +1,53 @@@
  <?php
  
  /**
- * ownCloud - gallery application
- *
- * @author Bartek Przybylski
- * @copyright 2012 Bartek Przybylski bart.p.pl@gmail.com
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either 
- * version 3 of the License, or any later version.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Lesser General Public 
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- * 
- */
+  * ownCloud - gallery application
+  *
+  * @author Bartek Przybylski
+  * @copyright 2012 Bartek Przybylski bart.p.pl@gmail.com
+  * 
+  * This library is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+  * License as published by the Free Software Foundation; either 
+  * version 3 of the License, or any later version.
+  * 
+  * This library is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+  * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public 
+  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+  * 
+  */
  class OC_Gallery_Photo {
 -
 -      public static function create($albumId, $img) {
 -              $stmt = OCP\DB::prepare('INSERT INTO *PREFIX*gallery_photos (album_id, file_path) VALUES (?, ?)');
 +      public static function create($albumId, $img){
 +              $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*gallery_photos` (`album_id`, `file_path`) VALUES (?, ?)');
                $stmt->execute(array($albumId, $img));
        }
 -
 -      public static function find($albumId, $img = null) {
 -              $sql = 'SELECT * FROM *PREFIX*gallery_photos WHERE album_id = ?';
 +      public static function find($albumId, $img=null){
 +              $sql = 'SELECT * FROM `*PREFIX*gallery_photos` WHERE `album_id` = ?';
                $args = array($albumId);
 -              if (!is_null($img)) {
 -                      $sql .= ' AND file_path = ?';
 +              if (!is_null($img)){
 +                      $sql .= ' AND `file_path` = ?';
                        $args[] = $img;
                }
                $stmt = OCP\DB::prepare($sql);
                return $stmt->execute($args);
        }
-       public static function findForAlbum($owner, $album_name){
+       public static function findForAlbum($owner, $album_name) {
                $stmt = OCP\DB::prepare('SELECT *'
-                       .' FROM `*PREFIX*gallery_photos photos`,'
-                               .' `*PREFIX*gallery_albums albums`'
-                       .' WHERE `albums`.`uid_owner` = ?'
-                               .' AND `albums`.`album_name` = ?'
-                               .' AND `photos`.`album_id` = `albums`.`album_id`');
 -                                      .' FROM *PREFIX*gallery_photos photos,'
 -                                              .' *PREFIX*gallery_albums albums'
 -                                      .' WHERE albums.uid_owner = ?'
 -                                              .' AND albums.album_name = ?'
 -                                              .' AND photos.album_id = albums.album_id');
++                                      .' FROM `*PREFIX*gallery_photos photos`,'
++                                              .' `*PREFIX*gallery_albums albums`'
++                                      .' WHERE `albums`.`uid_owner` = ?'
++                                              .' AND `albums`.`album_name` = ?'
++                                              .' AND `photos`.`album_id` = `albums`.`album_id`');
                return $stmt->execute(array($owner, $album_name));
        }
  
-   public static function removeByPath($path, $album_id) {
-     $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*gallery_photos` WHERE `file_path` LIKE ? AND `album_id` = ?');
+       public static function removeByPath($path, $album_id) {
 -              $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*gallery_photos WHERE file_path LIKE ? and album_id = ?');
++              $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*gallery_photos` WHERE `file_path` LIKE ? AND `album_id` = ?');
                $stmt->execute(array($path, $album_id));
        }
  
Simple merge
index 8f8f1e985a6f3dcad20646d2f557ee39a56c556a,4951399fa188be4ed5640535dec2b7e4e9c671c6..807d94bcdebeccebf9b6578412cc44066446090e
@@@ -77,7 -77,7 +77,7 @@@ class OC_MEDIA_AMPACHE
                                        $songs=OC_MEDIA_COLLECTION::getSongCount();
                                        $artists=OC_MEDIA_COLLECTION::getArtistCount();
                                        $albums=OC_MEDIA_COLLECTION::getAlbumCount();
-                                       $query=OCP\DB::prepare("INSERT INTO `*PREFIX*media_sessions` (`session_id`, `token`, `user_id`, `start`) VALUES (NULL, ?, ?, now());");
 -                                      $query=OCP\DB::prepare("INSERT INTO *PREFIX*media_sessions (`token`, `user_id`, `start`) VALUES (?, ?, now());");
++                                      $query=OCP\DB::prepare("INSERT INTO `*PREFIX*media_sessions` (`token`, `user_id`, `start`) VALUES (?, ?, now());");
                                        $query->execute(array($token,$user));
                                        $expire=date('c',time()+600);
                                        echo('<?xml version="1.0" encoding="UTF-8"?>');
                                return false;
                        }
                }
+               $CONFIG_DBTYPE = OCP\Config::getSystemValue( "dbtype", "sqlite" );
+               if($CONFIG_DBTYPE == 'psql'){
+                       $interval = ' \'600s\'::interval ';
+               }else {
+                       $interval = '600';
+               }
                //remove old sessions
-               $query=OCP\DB::prepare("DELETE FROM `*PREFIX*media_sessions` WHERE `start`<(NOW()-600)");
 -              $query=OCP\DB::prepare("DELETE from *PREFIX*media_sessions WHERE start<(NOW() - ".$interval.")");
++              $query=OCP\DB::prepare("DELETE FROM `*PREFIX*media_sessions` WHERE `start`<(NOW() - ".$interval.")");
                $query->execute();
                
 -              $query=OCP\DB::prepare("SELECT user_id from *PREFIX*media_sessions WHERE token=?");
 +              $query=OCP\DB::prepare("SELECT `user_id` FROM `*PREFIX*media_sessions` WHERE `token`=?");
                $users=$query->execute(array($auth))->fetchAll();
                if(count($users)>0){
                        OC_MEDIA_COLLECTION::$uid=$users[0]['user_id'];
Simple merge
index f9f10584ddfafc35ebb4639c487c482016b17560,54502f425756a3cc41b330937707891ed311abd2..ff58e4e7350e0115c6f2b1aa0e49f980b49c0c0c
@@@ -39,13 -27,13 +27,13 @@@ class OC_MEDIA
         * @param array $params, parameters passed from OC_Hook
         */
        public static function loginListener($params){
-               if(isset($_POST['user']) and $_POST['password']){
-                       $name=$_POST['user'];
+               if(isset($params['uid']) and $params['password']){
+                       $name=$params['uid'];
 -                      $query=OCP\DB::prepare("SELECT user_id from *PREFIX*media_users WHERE user_id LIKE ?");
 +                      $query=OCP\DB::prepare("SELECT `user_id` from `*PREFIX*media_users` WHERE `user_id` LIKE ?");
                        $uid=$query->execute(array($name))->fetchAll();
                        if(count($uid)==0){
 -                              $password=hash('sha256',$params['password']);
 -                              $query=OCP\DB::prepare("INSERT INTO *PREFIX*media_users (user_id, user_password_sha256) VALUES (?, ?);");
 +                              $password=hash('sha256',$_POST['password']);
 +                              $query=OCP\DB::prepare("INSERT INTO `*PREFIX*media_users` (`user_id`, `user_password_sha256`) VALUES (?, ?);");
                                $query->execute(array($name,$password));
                        }
                }
index b6934e87d67b7fbb2e385803ac95d081e9d29000,c1765640c5ddc08a961da051d10c0d5d22986779..b9e236800379f98b99f89dac5777ca2e5843e494
@@@ -2,8 -2,8 +2,8 @@@
  
  class OC_remoteStorage {
        public static function getValidTokens($ownCloudUser, $category) {
-               $query=OCP\DB::prepare("SELECT `token`,`appUrl`,`category` FROM `*PREFIX*authtoken` WHERE `user`=?",100);
 -              $query=OCP\DB::prepare("SELECT token,appUrl,category FROM *PREFIX*authtoken WHERE user=? LIMIT 100");
--              $result=$query->execute(array($ownCloudUser));
++              $stmt=OCP\DB::prepare("SELECT `token`,`appUrl`,`category` FROM `*PREFIX*authtoken` WHERE `user`=?",100);
++              $result=$stmt->execute(array($ownCloudUser));
                $ret = array();
                while($row=$result->fetchRow()){
                        if(in_array($category, explode(',', $row['category']))) {
  
    public static function getTokenFor($appUrl, $categories) {
                $user=OCP\USER::getUser();
-               $query=OCP\DB::prepare("SELECT `token` FROM `*PREFIX*authtoken` WHERE `user`=? AND `appUrl`=? AND `category`=?",1);
 -              $query=OCP\DB::prepare("SELECT token FROM *PREFIX*authtoken WHERE user=? AND appUrl=? AND category=? LIMIT 1");
--              $result=$query->execute(array($user, $appUrl, $categories));
-               $ret = array();
++              $stmt=OCP\DB::prepare("SELECT `token` FROM `*PREFIX*authtoken` WHERE `user`=? AND `appUrl`=? AND `category`=?",1);
++              $result=$stmt->execute(array($user, $appUrl, $categories));
                if($row=$result->fetchRow()) {
-                 return base64_encode('remoteStorage:'.$row['token']);
-     } else {
-       return false;
-     }
+                       return base64_encode('remoteStorage:'.$row['token']);
+               } else {
+                       return false;
+               }
        }
  
        public static function getAllTokens() {
                $user=OCP\USER::getUser();
-               $query=OCP\DB::prepare("SELECT `token`,`appUrl`,`category` FROM `*PREFIX*authtoken` WHERE `user`=?",100);
 -              $query=OCP\DB::prepare("SELECT token,appUrl,category FROM *PREFIX*authtoken WHERE user=? LIMIT 100");
--              $result=$query->execute(array($user));
++              $stmt=OCP\DB::prepare("SELECT `token`,`appUrl`,`category` FROM `*PREFIX*authtoken` WHERE `user`=?",100);
++              $result=$stmt->execute(array($user));
                $ret = array();
                while($row=$result->fetchRow()){
                        $ret[$row['token']] = array(
  
        public static function deleteToken($token) {
                $user=OCP\USER::getUser();
-               $query=OCP\DB::prepare("DELETE FROM `*PREFIX*authtoken` WHERE `token`=? AND `user`=?");
-               $result=$query->execute(array($token,$user));
 -              $query=OCP\DB::prepare("DELETE FROM *PREFIX*authtoken WHERE token=? AND user=?");
 -              $query->execute(array($token,$user));
++              $stmt=OCP\DB::prepare("DELETE FROM `*PREFIX*authtoken` WHERE `token`=? AND `user`=?");
++              $stmt->execute(array($token,$user));
                return 'unknown';//how can we see if any rows were affected?
        }
        private static function addToken($token, $appUrl, $categories){
                $user=OCP\USER::getUser();
-               $query=OCP\DB::prepare("INSERT INTO `*PREFIX*authtoken` (`token`,`appUrl`,`user`,`category`) VALUES(?,?,?,?)");
-               $result=$query->execute(array($token,$appUrl,$user,$categories));
 -              $query=OCP\DB::prepare("INSERT INTO *PREFIX*authtoken (`token`,`appUrl`,`user`,`category`) VALUES(?,?,?,?)");
 -              $query->execute(array($token,$appUrl,$user,$categories));
++              $stmt=OCP\DB::prepare("INSERT INTO `*PREFIX*authtoken` (`token`,`appUrl`,`user`,`category`) VALUES(?,?,?,?)");
++              $stmt->execute(array($token,$appUrl,$user,$categories));
        }
        public static function createCategories($appUrl, $categories) {
                $token=uniqid();
Simple merge
diff --cc core/js/js.js
index dec6ea047c05178e9ecf2ffdf7d832d51d23c41f,499e6b7525c1d4cc3ef6c8d5e048e8bb3af3d596..86e802cd3483907a48d12847c48618a896970b8b
@@@ -420,8 -475,9 +475,9 @@@ $(document).ready(function()
                }
        }
        // hide log in button etc. when form fields not filled
-       checkShowCredentials();
-       $('input#user, input#password').keyup(checkShowCredentials);
 -        // commented out due to some browsers having issues with it
++      // commented out due to some browsers having issues with it
+       // checkShowCredentials();
+       // $('input#user, input#password').keyup(checkShowCredentials);
  
        $('#settings #expand').keydown(function(event) {
                if (event.which == 13 || event.which == 32) {
@@@ -478,16 -534,16 +534,16 @@@ if (!Array.prototype.map)
                                res[i] = fun.call(thisp, t[i], i, t);
                        }
                }
-               
-           return res;
 -          return res;
++              return res;
        };
  }
  
  /**
   * Filter Jquery selector by attribute value
   **/
- $.fn.filterAttr = function(attr_name, attr_value) {  
-    return this.filter(function() { return $(this).attr(attr_name) === attr_value; });
+ $.fn.filterAttr = function(attr_name, attr_value) {
 -   return this.filter(function() { return $(this).attr(attr_name) === attr_value; });
++      return this.filter(function() { return $(this).attr(attr_name) === attr_value; });
  };
  
  function humanFileSize(size) {
index 992d1db41412d43097e9d15af35d02fffb8ec508,a5470a2d049c24904c7ffce3d330794249ac8870..73ac2c28960a19556130d622caaf49f91fdf03c3
  
     <field>
      <name>propertyvalue</name>
 -    <type>clob</type>
++    <type>test</type>
+     <notnull>true</notnull>
+    </field>
+   </declaration>
+  </table>
+   <table>
+   <name>*dbprefix*share</name>
+   <declaration>
+    <field>
+     <name>id</name>
+     <autoincrement>1</autoincrement>
+     <type>integer</type>
+     <default>0</default>
+     <notnull>true</notnull>
+     <length>4</length>
+    </field>
+    <field>
+     <name>share_type</name>
+     <type>integer</type>
+     <default></default>
+     <notnull>true</notnull>
+     <length>1</length>
+    </field>
+    
+    <field>
+     <name>share_with</name>
+     <type>text</type>
+     <default></default>
+     <notnull>true</notnull>
+     <length>255</length>
+    </field>
+    
+    <field>
+     <name>uid_owner</name>
+     <type>text</type>
+     <default></default>
+     <notnull>true</notnull>
+     <length>255</length>
+    </field>
+    
+    <field>
+     <name>parent</name>
+     <type>integer</type>
+     <default></default>
+     <notnull>false</notnull>
+     <length>4</length>
+    </field>
+    
+    <field>
+     <name>item_type</name>
+     <type>text</type>
+     <default></default>
+     <notnull>true</notnull>
+     <length>64</length>
+    </field>
+    
+    <field>
+     <name>item_source</name>
+     <type>text</type>
+     <default></default>
+     <notnull>false</notnull>
+     <length>255</length>
+    </field>
+       
+    <field>
+     <name>item_target</name>
      <type>text</type>
+     <default></default>
+     <notnull>false</notnull>
+     <length>255</length>
+    </field>
+    
+    <field>
+     <name>file_source</name>
+     <type>integer</type>
+     <default></default>
+     <notnull>false</notnull>
+     <length>4</length>
+    </field>
+       
+    <field>
+     <name>file_target</name>
+     <type>text</type>
+     <default></default>
+     <notnull>false</notnull>
+     <length>512</length>
+    </field>
+    <field>
+     <name>permissions</name>
+     <type>integer</type>
+     <default></default>
+     <notnull>true</notnull>
+     <length>1</length>
+    </field>
+    
+    <field>
+     <name>stime</name>
+     <type>integer</type>
+     <default></default>
+     <notnull>true</notnull>
+     <length>8</length>
+    </field>
+    
+    <field>
+     <name>accepted</name>
+     <type>integer</type>
+     <default>0</default>
      <notnull>true</notnull>
+     <length>1</length>
     </field>
  
    </declaration>
  
   </table>
 -    <type>clob</type>
+  
+  <table>
+   <name>*dbprefix*queuedtasks</name>
+   <declaration>
+    <field>
+     <name>id</name>
+     <type>integer</type>
+     <default>0</default>
+     <notnull>true</notnull>
+     <autoincrement>1</autoincrement>
+     <unsigned>true</unsigned>
+     <length>4</length>
+    </field>
+    <field>
+     <name>app</name>
+     <type>text</type>
+     <default></default>
+     <notnull>true</notnull>
+     <length>255</length>
+    </field>
+    <field>
+     <name>klass</name>
+     <type>text</type>
+     <default></default>
+     <notnull>true</notnull>
+     <length>255</length>
+    </field>
+    <field>
+     <name>method</name>
+     <type>text</type>
+     <default></default>
+     <notnull>true</notnull>
+     <length>255</length>
+    </field>
+    <field>
+     <name>parameters</name>
++    <type>text</type>
+     <notnull>true</notnull>
+    </field>
+   </declaration>
+  </table>
  
   <table>
  
diff --cc index.php
index 89eaec7d21a911eea99e7facfcaf24722e8ec982,331d7fae8e0b8e4de2d8bb2fa3b38b12977a3c10..a972993c19ca85e782d00f3979d382f93b3edee2
mode 100644,100755..100755
+++ b/index.php
diff --cc lib/app.php
index f9292b331bbd007f47eef66653c975a420971bd2,1c91818ca759959d5da5c2f42fd786162bb11168..74315903467fc332b3f6c5740f0fbb8fb7268a5a
mode 100644,100755..100755
@@@ -138,8 -144,10 +144,10 @@@ class OC_App
         * get all enabled apps
         */
        public static function getEnabledApps(){
+               if(!OC_Config::getValue('installed', false))
+                       return array();
                $apps=array('files');
 -              $query = OC_DB::prepare( 'SELECT appid FROM *PREFIX*appconfig WHERE configkey = \'enabled\' AND configvalue=\'yes\'' );
 +              $query = OC_DB::prepare( 'SELECT `appid` FROM `*PREFIX*appconfig` WHERE `configkey` = \'enabled\' AND `configvalue`=\'yes\'' );
                $result=$query->execute();
                while($row=$result->fetchRow()){
                        if(array_search($row['appid'],$apps)===false){
        }
  
        /**
-        * get the installed version of all papps
+        * get the installed version of all apps
         */
        public static function getAppVersions(){
+               static $versions;
+               if (isset($versions)) {   // simple cache, needs to be fixed
+                       return $versions; // when function is used besides in checkUpgrade
+               }
                $versions=array();
 -              $query = OC_DB::prepare( 'SELECT appid, configvalue FROM *PREFIX*appconfig WHERE configkey = \'installed_version\'' );
 +              $query = OC_DB::prepare( 'SELECT `appid`, `configvalue` FROM `*PREFIX*appconfig` WHERE `configkey` = \'installed_version\'' );
                $result = $query->execute();
                while($row = $result->fetchRow()){
                        $versions[$row['appid']]=$row['configvalue'];
Simple merge
index a12f2a5440652e0723ba8d4864a0b1b3144effbc,1db4fc09446679cf06f08b7a84da94c2f32d74bd..0ddc8b18d2f9fa16a28864582435332deaa2e014
@@@ -41,9 -41,10 +41,10 @@@ class OC_Connector_Sabre_Locks extends 
                // NOTE: the following 10 lines or so could be easily replaced by
                // pure sql. MySQL's non-standard string concatination prevents us
                // from doing this though.
-               // Fix: sqlite does not insert time() as a number but as text, making
-               // the equation returning false all the time
-               $query = 'SELECT * FROM `*PREFIX*locks` WHERE `userid` = ? AND (`created` + `timeout`) > '.time().' AND ((`uri` = ?)';
+               // NOTE: SQLite requires time() to be inserted directly. That's ugly
+               // but otherwise reading locks from SQLite Databases will return 
+               // nothing
 -              $query = 'SELECT * FROM *PREFIX*locks WHERE userid = ? AND (created + timeout) > '.time().' AND (( uri = ?)';
++              $query = 'SELECT * FROM `*PREFIX*locks` WHERE `userid` = ? AND (`created` + `timeout`) > '.time().' AND (( `uri` = ?)';
                $params = array(OC_User::getUser(),$uri);
  
                // We need to check locks for every part in the uri.
@@@ -72,8 -73,8 +73,8 @@@
                }
                $query.=')';
  
-               $stmt = OC_DB::prepare($query);
-               $result = $stmt->execute($params);
 -              $stmt = OC_DB::prepare($query );
++              $stmt = OC_DB::prepare( $query );
+               $result = $stmt->execute( $params );
                
                $lockList = array();
                while( $row = $result->fetchRow()){
index ce5cc022085f8851b29c2838ae0d9061df2f3956,f268f8b57c4b7a06d8b76e488db8e10b4fee0c93..b9bf474a0412f905aadf8bb33131e87f44820f0d
@@@ -156,25 -180,76 +180,76 @@@ abstract class OC_Connector_Sabre_Node 
         * @param array $properties
         * @return void
         */
-       function getProperties($properties) {
-               // At least some magic in here :-)
-               $query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?' );
-               $result = $query->execute( array( OC_User::getUser(), $this->path ));
-               $existing = array();
-               while( $row = $result->fetchRow()){
-                       $existing[$row['propertyname']] = $row['propertyvalue'];
+       public function getProperties($properties) {
+               if (is_null($this->property_cache)) {
 -                      $query = OC_DB::prepare( 'SELECT * FROM *PREFIX*properties WHERE userid = ? AND propertypath = ?' );
++                      $query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?' );
+                       $result = $query->execute( array( OC_User::getUser(), $this->path ));
+                       $this->property_cache = array();
+                       while( $row = $result->fetchRow()){
+                               $this->property_cache[$row['propertyname']] = $row['propertyvalue'];
+                       }
                }
  
+               // if the array was empty, we need to return everything
                if(count($properties) == 0){
-                       return $existing;
+                       return $this->property_cache;
                }
                
-               // if the array was empty, we need to return everything
                $props = array();
                foreach($properties as $property) {
-                       if (isset($existing[$property])) $props[$property] = $existing[$property];
+                       if (isset($this->property_cache[$property])) $props[$property] = $this->property_cache[$property];
                }
                return $props;
        }
 -              $query = OC_DB::prepare( 'INSERT INTO *PREFIX*properties (userid,propertypath,propertyname,propertyvalue) VALUES(?,?,?,?)' );
+       /**
+        * Creates a ETag for this path.
+        * @param string $path Path of the file
+        * @return string|null Returns null if the ETag can not effectively be determined
+        */
+       static protected function createETag($path) {
+               return uniqid('', true);
+       }
+       /**
+        * Returns the ETag surrounded by double-quotes for this path.
+        * @param string $path Path of the file
+        * @return string|null Returns null if the ETag can not effectively be determined
+        */
+       static public function getETagPropertyForPath($path) {
+               $tag = self::createETag($path);
+               if (empty($tag)) {
+                       return null;
+               }
+               $etag = '"'.$tag.'"';
 -              $query = OC_DB::prepare( 'DELETE FROM *PREFIX*properties'
 -                      .' WHERE userid = ?'
 -                      .' AND propertyname = ?'
 -                      .' AND propertypath IN ('.$path_placeholders.')'
++              $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*properties` (`userid`,`propertypath`,`propertyname`,`propertyvalue`) VALUES(?,?,?,?)' );
+               $query->execute( array( OC_User::getUser(), $path, self::GETETAG_PROPERTYNAME, $etag ));
+               return $etag;
+       }
+       /**
+        * Remove the ETag from the cache.
+        * @param string $path Path of the file
+        */
+       static public function removeETagPropertyForPath($path) {
+               // remove tags from this and parent paths
+               $paths = array();
+               while ($path != '/' && $path != '') {
+                       $paths[] = $path;
+                       $path = dirname($path);
+               }
+               if (empty($paths)) {
+                       return;
+               }
+               $paths[] = $path;
+               $path_placeholders = join(',', array_fill(0, count($paths), '?'));
++              $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*properties`'
++                      .' WHERE `userid` = ?'
++                      .' AND `propertyname` = ?'
++                      .' AND `propertypath` IN ('.$path_placeholders.')'
+                       );
+               $vals = array( OC_User::getUser(), self::GETETAG_PROPERTYNAME );
+               $query->execute(array_merge( $vals, $paths ));
+       }
  }
diff --cc lib/db.php
index 0d272f630372d4494aa17b86be7c0b5dfd5fd4b0,f1928e6823649b6963787aee02eb514de687d44f..208e70f4c35ca24a5a39a54ba4224c232f855071
@@@ -44,18 -42,15 +42,18 @@@ class OC_DB 
         * @return BACKEND_MDB2 or BACKEND_PDO
         */
        private static function getDBBackend(){
-               if(class_exists('PDO') && OC_Config::getValue('installed', false)){//check if we can use PDO, else use MDB2 (instalation always needs to be done my mdb2)
 -              $backend=self::BACKEND_MDB2;
+               if(class_exists('PDO') && OC_Config::getValue('installed', false)){//check if we can use PDO, else use MDB2 (installation always needs to be done my mdb2)
                        $type = OC_Config::getValue( "dbtype", "sqlite" );
-                         if($type=='oci') { //oracle also always needs mdb2
-                                 return self::BACKEND_MDB2;
-                         }
++                      if($type=='oci') { //oracle also always needs mdb2
++                              return self::BACKEND_MDB2;
++                      }
                        if($type=='sqlite3') $type='sqlite';
                        $drivers=PDO::getAvailableDrivers();
                        if(array_search($type,$drivers)!==false){
 -                              $backend=self::BACKEND_PDO;
 +                              return self::BACKEND_PDO;
                        }
                }
-                 return self::BACKEND_MDB2;
++              return self::BACKEND_MDB2;
        }
        
        /**
                                        }else{
                                                $dsn='pgsql:dbname='.$name.';host='.$host;
                                        }
+                                       /**
+                                       * Ugly fix for pg connections pbm when password use spaces
+                                       */
+                                       $e_user = addslashes($user);
+                                       $e_password = addslashes($pass);
+                                       $pass = $user = null;
+                                       $dsn .= ";user='$e_user';password='$e_password'";
+                                       /** END OF FIX***/
                                        break;
-                                 case 'oci': // Oracle with PDO is unsupported
-                                         if ($port) {
-                                                 $dsn = 'oci:dbname=//' . $host . ':' . $port . '/' . $name;
-                                         } else {
-                                                 $dsn = 'oci:dbname=//' . $host . '/' . $name;
-                                         }
-                                         break;
-                         }
++                              case 'oci': // Oracle with PDO is unsupported
++                                              if ($port) {
++                                                              $dsn = 'oci:dbname=//' . $host . ':' . $port . '/' . $name;
++                                              } else {
++                                                              $dsn = 'oci:dbname=//' . $host . '/' . $name;
++                                              }
++                                              break;
+                       }
                        try{
                                self::$PDO=new PDO($dsn,$user,$pass,$opts);
                        }catch(PDOException $e){
                                                'database' => $name
                                        );
                                        break;
-                                 case 'oci':
-                                             $dsn = array(
-                                                     'phptype'  => 'oci8',
-                                                     'username' => $user,
-                                                     'password' => $pass,
-                                             );
-                                             if ($host != '') {
-                                                 $dsn['hostspec'] = $host;
-                                                 $dsn['database'] = $name;
-                                             } else { // use dbname for hostspec
-                                                 $dsn['hostspec'] = $name;
-                                             }
++                              case 'oci':
++                                      $dsn = array(
++                                                      'phptype'  => 'oci8',
++                                                      'username' => $user,
++                                                      'password' => $pass,
++                                      );
++                                      if ($host != '') {
++                                              $dsn['hostspec'] = $host;
++                                              $dsn['database'] = $name;
++                                      } else { // use dbname for hostspec
++                                              $dsn['hostspec'] = $name;
++                                      }
 +                                      break;
                        }
                        
                        // Try to establish connection
         *
         * SQL query via MDB2 prepare(), needs to be execute()'d!
         */
 -      static public function prepare( $query ){
 +      static public function prepare( $query , $limit=null, $offset=null ){
-             
-             if (!is_null($limit)) {
-                 if (self::$backend == self::BACKEND_MDB2) {
-                     //MDB2 uses or emulates limits & offset internally
-                     self::$MDB2->setLimit($limit, $offset);
-                 } else {
-                     //PDO does not handle limit and offset.
-                     //FIXME: check limit notation for other dbs
-                     //the following sql thus might needs to take into account db ways of representing it
-                     //(oracle has no LIMIT / OFFSET)
-                         $limitsql = ' LIMIT ' . $limit;
-                     if (!is_null($offset)) {
-                         $limitsql .= ' OFFSET ' . $offset;
-                     }
-                     //insert limitsql
-                     if (substr($query, -1) == ';') { //if query ends with ;
-                         $query = substr($query, 0, -1) . $limitsql . ';';
-                     } else {
-                         $query.=$limitsql;
-                     }
-                 }
-             }
-         // Optimize the query
++              
++              if (!is_null($limit)) {
++                      if (self::$backend == self::BACKEND_MDB2) {
++                              //MDB2 uses or emulates limits & offset internally
++                              self::$MDB2->setLimit($limit, $offset);
++                      } else {
++                              //PDO does not handle limit and offset.
++                              //FIXME: check limit notation for other dbs
++                              //the following sql thus might needs to take into account db ways of representing it
++                              //(oracle has no LIMIT / OFFSET)
++                                      $limitsql = ' LIMIT ' . $limit;
++                              if (!is_null($offset)) {
++                                      $limitsql .= ' OFFSET ' . $offset;
++                              }
++                              //insert limitsql
++                              if (substr($query, -1) == ';') { //if query ends with ;
++                                      $query = substr($query, 0, -1) . $limitsql . ';';
++                              } else {
++                                      $query.=$limitsql;
++                              }
++                      }
++              }
++
+               // Optimize the query
                $query = self::processQuery( $query );
  
                self::connect();
                $file2 = 'static://db_scheme';
                $content = str_replace( '*dbname*', $CONFIG_DBNAME, $content );
                $content = str_replace( '*dbprefix*', $CONFIG_DBTABLEPREFIX, $content );
-                 /* FIXME: REMOVE this commented code
-                  * actually mysql, postgresql, sqlite and oracle support CUURENT_TIMESTAMP
-                  * http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
-                  * http://www.postgresql.org/docs/8.1/static/functions-datetime.html
-                  * http://www.sqlite.org/lang_createtable.html
-                  * http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions037.htm
-                  if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite doesn't
-                          $content = str_replace( '<default>0000-00-00 00:00:00</default>', '<default>CURRENT_TIMESTAMP</default>', $content );
-                  }
-                  */
 -              if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite doesn't
 -                      $content = str_replace( '<default>0000-00-00 00:00:00</default>', '<default>CURRENT_TIMESTAMP</default>', $content );
 -              }
++              /* FIXME: REMOVE this commented code
++               * actually mysql, postgresql, sqlite and oracle support CURRENT_TIMESTAMP
++               * http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
++               * http://www.postgresql.org/docs/8.1/static/functions-datetime.html
++               * http://www.sqlite.org/lang_createtable.html
++               * http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions037.htm
++
++               if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite doesn't
++                               $content = str_replace( '<default>0000-00-00 00:00:00</default>', '<default>CURRENT_TIMESTAMP</default>', $content );
++               }
++               */
                file_put_contents( $file2, $content );
  
                // Try to create tables
                if( $definition instanceof MDB2_Schema_Error ){
                        die( $definition->getMessage().': '.$definition->getUserInfo());
                }
- //            if(OC_Config::getValue('dbtype','sqlite')=='sqlite'){
- //                    $definition['overwrite']=true;//always overwrite for sqlite
- //            }
-                 if(OC_Config::getValue('dbtype','sqlite')==='oci'){
-                         unset($definition['charset']); //or MDB2 tries SHUTDOWN IMMEDIATE
-                         $oldname = $definition['name'];
-                         $definition['name']=OC_Config::getValue( "dbuser", $oldname );
-                 }
-                 
++              if(OC_Config::getValue('dbtype','sqlite')==='oci'){
++                      unset($definition['charset']); //or MDB2 tries SHUTDOWN IMMEDIATE
++                      $oldname = $definition['name'];
++                      $definition['name']=OC_Config::getValue( "dbuser", $oldname );
++              }
++              
                $ret=self::$schema->createDatabase( $definition );
  
                // Die in case something went wrong
                if( $ret instanceof MDB2_Error ){
-                         echo (self::$MDB2->getDebugOutput());
++                      echo (self::$MDB2->getDebugOutput());
                        die ($ret->getMessage() . ': ' . $ret->getUserInfo());
                }
  
                $file2 = 'static://db_scheme';
                $content = str_replace( '*dbname*', $previousSchema['name'], $content );
                $content = str_replace( '*dbprefix*', $CONFIG_DBTABLEPREFIX, $content );
-                 /* FIXME: REMOVE this commented code
-                  * actually mysql, postgresql, sqlite and oracle support CUURENT_TIMESTAMP
-                  * http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
-                  * http://www.postgresql.org/docs/8.1/static/functions-datetime.html
-                  * http://www.sqlite.org/lang_createtable.html
-                  * http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions037.htm
++              /* FIXME: REMOVE this commented code
++               * actually mysql, postgresql, sqlite and oracle support CUURENT_TIMESTAMP
++               * http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
++               * http://www.postgresql.org/docs/8.1/static/functions-datetime.html
++               * http://www.sqlite.org/lang_createtable.html
++               * http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions037.htm
                if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite doesn't
                        $content = str_replace( '<default>0000-00-00 00:00:00</default>', '<default>CURRENT_TIMESTAMP</default>', $content );
                }
-                  */
++               */
                file_put_contents( $file2, $content );
                $op = self::$schema->updateDatabase($file2, $previousSchema, array(), false);
                
index 719f419b37cac57d89c1efebc861da6d09cf772b,352fc695f30d5217d23de9d927eede581e72a975..e85d6747f905b133db40c00d20a44a7d46e2678c
@@@ -174,15 -155,17 +158,17 @@@ class OC_FileCache
                $oldPath=$root.$oldPath;
                $newPath=$root.$newPath;
                $newParent=self::getParentId($newPath);
 -              $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET parent=? ,name=?, path=?, path_hash=? WHERE path_hash=?');
 +              $query=OC_DB::prepare('UPDATE `*PREFIX*fscache` SET `parent`=? ,`name`=?, `path`=?, `path_hash`=? WHERE `path_hash`=?');
                $query->execute(array($newParent,basename($newPath),$newPath,md5($newPath),md5($oldPath)));
  
 -              $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE path LIKE ?');
+               if(($cache=OC_Cache::getUserCache(true)) && $cache->hasKey('fileid/'.$oldPath)){
+                       $cache->set('fileid/'.$newPath,$cache->get('fileid/'.$oldPath));
+                       $cache->remove('fileid/'.$oldPath);
+               }
 +              $query=OC_DB::prepare('SELECT `path` FROM `*PREFIX*fscache` WHERE `path` LIKE ?');
                $oldLength=strlen($oldPath);
 -              $updateQuery=OC_DB::prepare('UPDATE *PREFIX*fscache SET path=?, path_hash=? WHERE path_hash=?');
 +              $updateQuery=OC_DB::prepare('UPDATE `*PREFIX*fscache` SET `path`=?, `path_hash`=? WHERE `path_hash`=?');
                while($row= $query->execute(array($oldPath.'/%'))->fetchRow()){
                        $old=$row['path'];
                        $new=$newPath.substr($old,$oldLength);
  
        /**
         * delete info from the cache
-        * @param string/int $file
+        * @param string path
         * @param string root (optional)
         */
-       public static function delete($file,$root=''){
-               if(!is_numeric($file)){
-                       if(!$root){
-                               $root=OC_Filesystem::getRoot();
-                       }
-                       if($root=='/'){
-                               $root='';
-                       }
-                       $path=$root.$file;
-                       self::delete(self::getFileId($path));
-               }elseif($file!=-1){
-                       $query=OC_DB::prepare('SELECT `id` FROM `*PREFIX*fscache` WHERE `parent`=?');
-                       $result=$query->execute(array($file));
-                       while($child=$result->fetchRow()){
-                               self::delete(intval($child['id']));
-                       }
-                       $query=OC_DB::prepare('DELETE FROM `*PREFIX*fscache` WHERE `id`=?');
-                       $query->execute(array($file));
+       public static function delete($path,$root=false){
+               if($root===false){
+                       $root=OC_Filesystem::getRoot();
                }
 -              $query=OC_DB::prepare('DELETE FROM *PREFIX*fscache WHERE path_hash=?');
++              $query=OC_DB::prepare('DELETE FROM `*PREFIX*fscache` WHERE `path_hash`=?');
+               $query->execute(array(md5($root.$path)));
+               
+               //delete everything inside the folder
 -              $query=OC_DB::prepare('DELETE FROM *PREFIX*fscache WHERE path LIKE ?');
++              $query=OC_DB::prepare('DELETE FROM `*PREFIX*fscache` WHERE `path` LIKE ?');
+               $query->execute(array($root.$path.'/%'));
+               OC_Cache::remove('fileid/'.$root.$path);
        }
        
        /**
         * @param string root (optional)
         * @return array of filepaths
         */
-       public static function search($search,$returnData=false,$root=''){
-               if(!$root){
+       public static function search($search,$returnData=false,$root=false){
+               if($root===false){
                        $root=OC_Filesystem::getRoot();
                }
-               if($root=='/'){
-                       $root='';
-               }
                $rootLen=strlen($root);
                if(!$returnData){
 -                      $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE name LIKE ? AND `user`=?');
 +                      $query=OC_DB::prepare('SELECT `path` FROM `*PREFIX*fscache` WHERE `name` LIKE ? AND `user`=?');
                }else{
 -                      $query=OC_DB::prepare('SELECT * FROM *PREFIX*fscache WHERE name LIKE ? AND `user`=?');
 +                      $query=OC_DB::prepare('SELECT * FROM `*PREFIX*fscache` WHERE `name` LIKE ? AND `user`=?');
                }
                $result=$query->execute(array("%$search%",OC_User::getUser()));
                $names=array();
  
        /**
         * get the file id as used in the cache
-        * unlike the public getId, full paths are used here (/usename/files/foo instead of /foo)
-        * @param string $path
+        * @param string path
+        * @param string root (optional)
         * @return int
         */
-       private static function getFileId($path){
-               $query=OC_DB::prepare('SELECT `id` FROM `*PREFIX*fscache` WHERE `path_hash`=?');
-               if(OC_DB::isError($query)){
-                       OC_Log::write('files','error while getting file id of '.$path,OC_Log::ERROR);
-                       return -1;
+       public static function getId($path,$root=false){
+               if($root===false){
+                       $root=OC_Filesystem::getRoot();
+               }
+               $fullPath=$root.$path;
+               if(($cache=OC_Cache::getUserCache(true)) && $cache->hasKey('fileid/'.$fullPath)){
+                       return $cache->get('fileid/'.$fullPath);
                }
-               $result=$query->execute(array(md5($path)));
+               
 -              $query=OC_DB::prepare('SELECT id FROM *PREFIX*fscache WHERE path_hash=?');
++              $query=OC_DB::prepare('SELECT `id` FROM `*PREFIX*fscache` WHERE `path_hash`=?');
+               $result=$query->execute(array(md5($fullPath)));
                if(OC_DB::isError($result)){
                        OC_Log::write('files','error while getting file id of '.$path,OC_Log::ERROR);
                        return -1;
         * adjust the size of the parent folders
         * @param string $path
         * @param int $sizeDiff
+        * @param string root (optinal)
         */
-       private static function increaseSize($path,$sizeDiff){
+       public static function increaseSize($path,$sizeDiff, $root=false){
                if($sizeDiff==0) return;
-               while(($id=self::getFileId($path))!=-1){//walk up the filetree increasing the size of all parent folders
+               $id=self::getId($path,$root);
+               while($id!=-1){//walk up the filetree increasing the size of all parent folders
 -                      $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET size=size+? WHERE id=?');
 +                      $query=OC_DB::prepare('UPDATE `*PREFIX*fscache` SET `size`=`size`+? WHERE `id`=?');
                        $query->execute(array($sizeDiff,$id));
+                       $id=self::getParentId($path);
                        $path=dirname($path);
                }
        }
Simple merge
index 2a0c1cea93e64e8fab648eb8b07f3e2e758c2596,82fbf11afdf9fe450db6013e819856df6d1d6fa1..0a8e698215138af95fd4ad8450f2d22fe02d6516
@@@ -340,9 -336,16 +336,30 @@@ class OC_Filesystem
        static public function getLocalFile($path){
                return self::$defaultInstance->getLocalFile($path);
        }
+       /**
+        * @param string path
+        * @return string
+        */
+       static public function getLocalFolder($path){
+               return self::$defaultInstance->getLocalFolder($path);
+       }
+       
+       /**
+       * return path to file which reflects one visible in browser
++      * @param string path
++      * @return string
++      */
++      static public function getLocalPath($path) {
++              $datadir = \OCP\Config::getSystemValue('datadirectory').'/'.\OC_User::getUser().'/files';
++              $newpath = $path;
++              if (strncmp($newpath, $datadir, strlen($datadir)) == 0) {
++                      $newpath = substr($path, strlen($datadir));
++              }
++              return $newpath;
++      }
 +      
 +      /**
 +      * return path to file which reflects one visible in browser
        * @param string path
        * @return string
        */
index 5e52432c4926bf02256143d10c0affb33abd4822,0b4ae393cf1ff2ec330cf1d091cb0385564801d6..52608b2db73f87c7f113275fb4069ac3d16802a3
@@@ -51,10 -50,10 +50,10 @@@ class OC_Group_Database extends OC_Grou
         * Trys to create a new group. If the group name already exists, false will
         * be returned.
         */
-       public static function createGroup( $gid ){
+       public function createGroup( $gid ){
                // Check for existence
-               $query = OC_DB::prepare( 'SELECT `gid` FROM `*PREFIX*groups` WHERE `gid` = ?' );
 -              $query = OC_DB::prepare( "SELECT gid FROM `*PREFIX*groups` WHERE gid = ?" );
--              $result = $query->execute( array( $gid ));
++              $stmt = OC_DB::prepare( "SELECT `gid` FROM `*PREFIX*groups` WHERE `gid` = ?" );
++              $result = $stmt->execute( array( $gid ));
  
                if( $result->fetchRow() ){
                        // Can not add an existing group
@@@ -62,8 -61,8 +61,8 @@@
                }
                else{
                        // Add group and exit
-                       $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*groups` ( `gid` ) VALUES( ? )' );
 -                      $query = OC_DB::prepare( "INSERT INTO `*PREFIX*groups` ( `gid` ) VALUES( ? )" );
--                      $result = $query->execute( array( $gid ));
++                      $stmt = OC_DB::prepare( "INSERT INTO `*PREFIX*groups` ( `gid` ) VALUES( ? )" );
++                      $result = $stmt->execute( array( $gid ));
  
                        return $result ? true : false;
                }
         *
         * Deletes a group and removes it from the group_user-table
         */
-       public static function deleteGroup( $gid ){
+       public function deleteGroup( $gid ){
                // Delete the group
-               $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*groups` WHERE `gid` = ?' );
 -              $query = OC_DB::prepare( "DELETE FROM `*PREFIX*groups` WHERE gid = ?" );
--              $result = $query->execute( array( $gid ));
++              $stmt = OC_DB::prepare( "DELETE FROM `*PREFIX*groups` WHERE `gid` = ?" );
++              $result = $stmt->execute( array( $gid ));
  
                // Delete the group-user relation
-               $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*group_user` WHERE `gid` = ?' );
 -              $query = OC_DB::prepare( "DELETE FROM `*PREFIX*group_user` WHERE gid = ?" );
--              $result = $query->execute( array( $gid ));
++              $stmt = OC_DB::prepare( "DELETE FROM `*PREFIX*group_user` WHERE `gid` = ?" );
++              $result = $stmt->execute( array( $gid ));
  
                return true;
        }
         *
         * Checks whether the user is member of a group or not.
         */
-       public static function inGroup( $uid, $gid ){
+       public function inGroup( $uid, $gid ){
                // check
-               $query = OC_DB::prepare( 'SELECT `uid` FROM `*PREFIX*group_user` WHERE `gid` = ? AND `uid` = ?' );
 -              $query = OC_DB::prepare( "SELECT uid FROM `*PREFIX*group_user` WHERE gid = ? AND uid = ?" );
--              $result = $query->execute( array( $gid, $uid ));
++              $stmt = OC_DB::prepare( "SELECT `uid` FROM `*PREFIX*group_user` WHERE `gid` = ? AND `uid` = ?" );
++              $result = $stmt->execute( array( $gid, $uid ));
  
                return $result->fetchRow() ? true : false;
        }
         *
         * Adds a user to a group.
         */
-       public static function addToGroup( $uid, $gid ){
+       public function addToGroup( $uid, $gid ){
                // No duplicate entries!
-               if( !self::inGroup( $uid, $gid )){
-                       $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*group_user` ( `uid`, `gid` ) VALUES( ?, ? )' );
-                       $result = $query->execute( array( $uid, $gid ));
+               if( !$this->inGroup( $uid, $gid )){
 -                      $query = OC_DB::prepare( "INSERT INTO `*PREFIX*group_user` ( `uid`, `gid` ) VALUES( ?, ? )" );
 -                      $query->execute( array( $uid, $gid ));
++                      $stmt = OC_DB::prepare( "INSERT INTO `*PREFIX*group_user` ( `uid`, `gid` ) VALUES( ?, ? )" );
++                      $stmt->execute( array( $uid, $gid ));
                        return true;
                }else{
                        return false;
         *
         * removes the user from a group.
         */
-       public static function removeFromGroup( $uid, $gid ){
-               $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*group_user` WHERE `uid` = ? AND `gid` = ?' );
-               $result = $query->execute( array( $uid, $gid ));
+       public function removeFromGroup( $uid, $gid ){
 -              $query = OC_DB::prepare( "DELETE FROM *PREFIX*group_user WHERE uid = ? AND gid = ?" );
 -              $query->execute( array( $uid, $gid ));
++              $stmt = OC_DB::prepare( "DELETE FROM `*PREFIX*group_user` WHERE `uid` = ? AND `gid` = ?" );
++              $stmt->execute( array( $uid, $gid ));
  
                return true;
        }
         * This function fetches all groups a user belongs to. It does not check
         * if the user exists at all.
         */
-       public static function getUserGroups( $uid ){
+       public function getUserGroups( $uid ){
                // No magic!
-               $query = OC_DB::prepare( 'SELECT `gid` FROM `*PREFIX*group_user` WHERE `uid` = ?' );
 -              $query = OC_DB::prepare( "SELECT gid FROM `*PREFIX*group_user` WHERE uid = ?" );
--              $result = $query->execute( array( $uid ));
++              $stmt = OC_DB::prepare( "SELECT `gid` FROM `*PREFIX*group_user` WHERE `uid` = ?" );
++              $result = $stmt->execute( array( $uid ));
  
                $groups = array();
                while( $row = $result->fetchRow()){
         *
         * Returns a list with all groups
         */
-       public static function getGroups(){
-               $query = OC_DB::prepare( 'SELECT `gid` FROM `*PREFIX*groups`' );
-               $result = $query->execute();
 -      public function getGroups($search = '', $limit = -1, $offset = 0) {
 -              if ($limit == -1) {
 -                      $query = OC_DB::prepare('SELECT gid FROM *PREFIX*groups WHERE gid LIKE ?');
 -              } else {
 -                      $query = OC_DB::prepare('SELECT gid FROM *PREFIX*groups WHERE gid LIKE ? LIMIT '.$limit.' OFFSET '.$offset);
 -              }
 -              $result = $query->execute(array($search.'%'));
++      public function getGroups($search = '', $limit = null, $offset = null) {
++              $stmt = OC_DB::prepare('SELECT `gid` FROM `*PREFIX*groups` WHERE `gid` LIKE ?', $limit, $offset);
++              $result = $stmt->execute(array($search.'%'));
                $groups = array();
-               while( $row = $result->fetchRow()){
-                       $groups[] = $row["gid"];
+               while ($row = $result->fetchRow()) {
+                       $groups[] = $row['gid'];
                }
                return $groups;
        }
-       
+       /**
+        * check if a group exists
+        * @param string $gid
+        * @return bool
+        */
+       public function groupExists($gid) {
 -              $query = OC_DB::prepare('SELECT gid FROM *PREFIX*groups WHERE gid = ?');
++              $query = OC_DB::prepare('SELECT `gid` FROM `*PREFIX*groups` WHERE `gid` = ?');
+               $result = $query->execute(array($gid))->fetchOne();
+               if ($result) {
+                       return true;
+               }
+               return false;
+       }
        /**
         * @brief get a list of all users in a group
         * @returns array with user ids
         */
-       public static function usersInGroup($gid){
-               $query=OC_DB::prepare('SELECT `uid` FROM `*PREFIX*group_user` WHERE `gid`=?');
-               $users=array();
-               $result=$query->execute(array($gid));
-               while($row=$result->fetchRow()){
-                       $users[]=$row['uid'];
 -      public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0) {
 -              if ($limit == -1) {
 -                      $query = OC_DB::prepare('SELECT uid FROM *PREFIX*group_user WHERE gid = ? AND uid LIKE ?');
 -              } else {
 -                      $query = OC_DB::prepare('SELECT uid FROM *PREFIX*group_user WHERE gid = ? AND uid LIKE ? LIMIT '.$limit.' OFFSET '.$offset);
 -              }
 -              $result = $query->execute(array($gid, $search.'%'));
++      public function usersInGroup($gid, $search = '', $limit = null, $offset = null) {
++              $stmt = OC_DB::prepare('SELECT `uid` FROM `*PREFIX*group_user` WHERE `gid` = ? AND `uid` LIKE ?', $limit, $offset);
++              $result = $stmt->execute(array($gid, $search.'%'));
+               $users = array();
+               while ($row = $result->fetchRow()) {
+                       $users[] = $row['uid'];
                }
                return $users;
        }
index 18627d7d2ea8f42b78614df8a5c2b1771d7cfc5b,c91423e69bcd767abeaf0a20ecf730ad7264c89e..b6c4c3a163fb83b0eb762c5913177552125650ee
@@@ -147,9 -147,10 +147,10 @@@ class OC_Preferences
                        $query->execute( array( $user, $app, $key, $value ));
                }
                else{
 -                      $query = OC_DB::prepare( 'UPDATE *PREFIX*preferences SET configvalue = ? WHERE userid = ? AND appid = ? AND configkey = ?' );
 +                      $query = OC_DB::prepare( 'UPDATE `*PREFIX*preferences` SET `configvalue` = ? WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?' );
                        $query->execute( array( $value, $user, $app, $key ));
                }
+               return true;
        }
  
        /**
Simple merge
diff --cc lib/setup.php
index 61210560aba6d600328ddcb90a1676c7e334910e,4d71bed86e2d799389b096c3dae99317d4113d2e..f7e8c6950ce0c1fe2d1fb8d59355305bed5a0fa5
@@@ -422,80 -325,27 +441,100 @@@ class OC_Setup 
                        $entry.='Offending command was: '.$query.'<br />';
                        echo($entry);
                }
+               if(! pg_fetch_row($result)) {
+                       //user does not exists let's create it :)
+                       $query = "CREATE USER \"$e_name\" CREATEDB PASSWORD '$e_password';";
+                       $result = pg_query($connection, $query);
+                       if(!$result) {
+                               $entry='DB Error: "'.pg_last_error($connection).'"<br />';
+                               $entry.='Offending command was: '.$query.'<br />';
+                               echo($entry);
+                       }
+               }
+               else { // change password of the existing role
+                       $query = "ALTER ROLE \"$e_name\" WITH PASSWORD '$e_password';";
+                       $result = pg_query($connection, $query);
+                       if(!$result) {
+                               $entry='DB Error: "'.pg_last_error($connection).'"<br />';
+                               $entry.='Offending command was: '.$query.'<br />';
+                               echo($entry);
+                       }
+               }
        }
 +        /**
 +         * 
 +         * @param String $name
 +         * @param String $password
 +         * @param String $tablespace
 +         * @param resource $connection
 +         */
 +        private static function oci_createDBUser($name, $password, $tablespace, $connection) {
 +
 +                $query = "SELECT * FROM all_users WHERE USERNAME = :un";
 +                $stmt = oci_parse($connection, $query);
 +                if (!$stmt) {
 +                        $entry='DB Error: "'.oci_error($connection).'"<br />';
 +                        $entry.='Offending command was: '.$query.'<br />';
 +                        echo($entry);
 +                }
 +                oci_bind_by_name($stmt, ':un', $name);
 +                $result = oci_execute($stmt);
 +                if(!$result) {
 +                        $entry='DB Error: "'.oci_error($connection).'"<br />';
 +                        $entry.='Offending command was: '.$query.'<br />';
 +                        echo($entry);
 +                }
 +
 +                if(! oci_fetch_row($stmt)) {
 +                        //user does not exists let's create it :)
 +                        //password must start with alphabetic character in oracle
 +                        $query = 'CREATE USER '.$name.' IDENTIFIED BY "'.$password.'" DEFAULT TABLESPACE '.$tablespace; //TODO set default tablespace
 +                        $stmt = oci_parse($connection, $query);
 +                        if (!$stmt) {
 +                                $entry='DB Error: "'.oci_error($connection).'"<br />';
 +                                $entry.='Offending command was: '.$query.'<br />';
 +                                echo($entry);
 +                        }
 +                        //oci_bind_by_name($stmt, ':un', $name);
 +                        $result = oci_execute($stmt);
 +                        if(!$result) {
 +                                $entry='DB Error: "'.oci_error($connection).'"<br />';
 +                                $entry.='Offending command was: '.$query.', name:'.$name.', password:'.$password.'<br />';
 +                                echo($entry);
 +                        }
 +                } else { // change password of the existing role
 +                        $query = "ALTER USER :un IDENTIFIED BY :pw";
 +                        $stmt = oci_parse($connection, $query);
 +                        if (!$stmt) {
 +                                $entry='DB Error: "'.oci_error($connection).'"<br />';
 +                                $entry.='Offending command was: '.$query.'<br />';
 +                                echo($entry);
 +                        }
 +                        oci_bind_by_name($stmt, ':un', $name);
 +                        oci_bind_by_name($stmt, ':pw', $password);
 +                        $result = oci_execute($stmt);
 +                        if(!$result) {
 +                                $entry='DB Error: "'.oci_error($connection).'"<br />';
 +                                $entry.='Offending command was: '.$query.'<br />';
 +                                echo($entry);
 +                        }
 +                }
 +                // grant neccessary roles
 +                $query = 'GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER, UNLIMITED TABLESPACE TO '.$name;
 +                $stmt = oci_parse($connection, $query);
 +                if (!$stmt) {
 +                        $entry='DB Error: "'.oci_error($connection).'"<br />';
 +                        $entry.='Offending command was: '.$query.'<br />';
 +                        echo($entry);
 +                }
 +                $result = oci_execute($stmt);
 +                if(!$result) {
 +                        $entry='DB Error: "'.oci_error($connection).'"<br />';
 +                        $entry.='Offending command was: '.$query.', name:'.$name.', password:'.$password.'<br />';
 +                        echo($entry);
 +                }
 +        }
  
        /**
         * create .htaccess files for apache hosts
index dd5dbad4a99620d6cf329302207cccde915f3cde,5b6999af5330ac7a19492390f7bb417f6eae8a28..a10ddcd5c33156be30c4598192f675177a1ca317
@@@ -559,7 -475,7 +475,7 @@@ class OC_Template
        public static function printGuestPage( $application, $name, $parameters = array() ){
                $content = new OC_Template( $application, $name, "guest" );
                foreach( $parameters as $key => $value ){
-                       $content->assign( $key, $value );
 -                      $content->assign( $key, $value,false );
++                      $content->assign( $key, $value, false );
                }
                return $content->printPage();
        }
diff --cc lib/updater.php
Simple merge
diff --cc lib/user.php
index 9e0e82e79fed0bfb2217e50bdd3d9aee100cbb41,cbd1400844d15be99865e04098e1aacb24a41271..06a56b7f4a62b79c3d6e53df03e83dccbdd70a8e
@@@ -331,14 -338,12 +338,12 @@@ class OC_User 
         *
         * Get a list of all users.
         */
-       public static function getUsers(){
-               $users=array();
-               foreach(self::$_usedBackends as $backend){
-                       if($backend->implementsActions(OC_USER_BACKEND_GET_USERS)){
-                               $backendUsers=$backend->getUsers();
-                               if(is_array($backendUsers)){
-                                       $users=array_merge($users,$backendUsers);
-                               }
 -      public static function getUsers($search = '', $limit = -1, $offset = 0) {
++      public static function getUsers($search = '', $limit = null, $offset = null) {
+               $users = array();
+               foreach (self::$_usedBackends as $backend) {
+                       $backendUsers = $backend->getUsers($search, $limit, $offset);
+                       if (is_array($backendUsers)) {
+                               $users = array_merge($users, $backendUsers);
                        }
                }
                asort($users);
                }
                return false;
        }
 -              $query = "INSERT INTO *PREFIX*preferences (`userid`, `appid`, `configkey`, `configvalue`) VALUES(?, ?, ?, ?)";
+       
+       /**
+        * disables a user
+        * @param string $userid the user to disable
+        */
+       public static function disableUser($userid){
 -              $query = "DELETE FROM *PREFIX*preferences WHERE userid = ? AND appid = ? AND configkey = ? AND configvalue = ?";
++              $query = "INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, `configkey`, `configvalue`) VALUES(?, ?, ?, ?)";
+               $query = OC_DB::prepare($query);
+               $query->execute(array($userid, 'core', 'enabled', 'false'));
+       }
+       
+       /**
+        * enable a user
+        * @param string $userid
+        */
+       public static function enableUser($userid){
 -              $query = "SELECT userid FROM *PREFIX*preferences WHERE userid = ? AND appid = ? AND configkey = ? AND configvalue = ?";
++              $query = "DELETE FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? AND `configvalue` = ?";
+               $query = OC_DB::prepare($query);
+               $query->execute(array($userid, 'core', 'enabled', 'false'));
+       }
+       
+       /**
+        * checks if a user is enabled
+        * @param string $userid
+        * @return bool
+        */
+       public static function isEnabled($userid){
++              $query = "SELECT `userid` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? AND `configvalue` = ?";
+               $query = OC_DB::prepare($query);
+               $results = $query->execute(array($userid, 'core', 'enabled', 'false'));
+               return $results->numRows() ? false : true;
+       }
  
        /**
         * @brief Set cookie value to use in next page load
index 5464a4abfac93ea4bee67f561b35026fff3669cf,1deed5176107bd09342debcc4d194f5833398a7c..1746c4fe0c0db4630ec075b8c247c8edaa45510a
@@@ -70,7 -69,7 +69,7 @@@ class OC_User_Database extends OC_User_
                }else{
                        $hasher=$this->getHasher();
                        $hash = $hasher->HashPassword($password.OC_Config::getValue('passwordsalt', ''));
--                      $query = OC_DB::prepare( "INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )" );
++                      $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )' );
                        $result = $query->execute( array( $uid, $hash));
  
                        return $result ? true : false;
@@@ -86,8 -85,8 +85,8 @@@
         */
        public function deleteUser( $uid ){
                // Delete user-group-relation
-               $query = OC_DB::prepare( "DELETE FROM `*PREFIX*users` WHERE `uid` = ?" );
-               $result = $query->execute( array( $uid ));
 -              $query = OC_DB::prepare( "DELETE FROM `*PREFIX*users` WHERE uid = ?" );
++              $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*users` WHERE uid = ?' );
+               $query->execute( array( $uid ));
                return true;
        }
  
                if( $this->userExists($uid) ){
                        $hasher=$this->getHasher();
                        $hash = $hasher->HashPassword($password.OC_Config::getValue('passwordsalt', ''));
-                       $query = OC_DB::prepare( "UPDATE `*PREFIX*users` SET `password` = ? WHERE `uid` = ?" );
-                       $result = $query->execute( array( $hash, $uid ));
 -                      $query = OC_DB::prepare( "UPDATE *PREFIX*users SET password = ? WHERE uid = ?" );
++                      $query = OC_DB::prepare( 'UPDATE `*PREFIX*users` SET `password` = ? WHERE `uid` = ?' );
+                       $query->execute( array( $hash, $uid ));
  
                        return true;
-               }
-               else{
+               }else{
                        return false;
                }
        }
         * returns the user id or false
         */
        public function checkPassword( $uid, $password ){
-               $query = OC_DB::prepare( "SELECT `uid`, `password` FROM `*PREFIX*users` WHERE `uid` = ?" );
 -              $query = OC_DB::prepare( "SELECT uid, password FROM *PREFIX*users WHERE uid = ?" );
++              $query = OC_DB::prepare( 'SELECT `uid`, `password` FROM `*PREFIX*users` WHERE `uid` = ?' );
                $result = $query->execute( array( $uid));
  
                $row=$result->fetchRow();
         *
         * Get a list of all users.
         */
-       public function getUsers(){
-               $query = OC_DB::prepare( "SELECT `uid` FROM `*PREFIX*users`" );
-               $result = $query->execute();
-               $users=array();
-               while( $row = $result->fetchRow()){
-                       $users[] = $row["uid"];
 -      public function getUsers($search = '', $limit = -1, $offset = 0) {
 -              if ($limit == -1) {
 -                      $query = OC_DB::prepare('SELECT uid FROM *PREFIX*users WHERE uid LIKE ?');
 -              } else {
 -                      $query = OC_DB::prepare('SELECT uid FROM *PREFIX*users WHERE uid LIKE ? LIMIT '.$limit.' OFFSET '.$offset);
 -              }
++      public function getUsers($search = '', $limit = null, $offset = null) {
++              $query = OC_DB::prepare('SELECT `uid` FROM `*PREFIX*users` WHERE `uid` LIKE ? LIMIT',$limit,$offset);
+               $result = $query->execute(array($search.'%'));
+               $users = array();
+               while ($row = $result->fetchRow()) {
+                       $users[] = $row['uid'];
                }
                return $users;
        }
         * @return boolean
         */
        public function userExists($uid){
-               $query = OC_DB::prepare( "SELECT * FROM `*PREFIX*users` WHERE `uid` = ?" );
 -              $query = OC_DB::prepare( "SELECT * FROM `*PREFIX*users` WHERE uid = ?" );
++              $query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*users` WHERE `uid` = ?' );
                $result = $query->execute( array( $uid ));
                
                return $result->numRows() > 0;
Simple merge
Simple merge
Simple merge
index 508b4bf94ca99db56a59d4a25f1758953e30ba1b,f16e91e2001c63f2c995fc56b82ecb44e95f959c..eaca5b50745fe47fcfbeffdff577cf0e7a17b04b
@@@ -2,10 -2,9 +2,10 @@@
  
  // Init owncloud
  require_once('../../lib/base.php');
 +OCP\JSON::callCheck();
  
  // Check if we are a user
- if( !OC_User::isLoggedIn() || !OC_Group::inGroup( OC_User::getUser(), 'admin' )){
+ if( !OC_User::isLoggedIn() || (!OC_Group::inGroup( OC_User::getUser(), 'admin' ) && !OC_SubAdmin::isSubAdmin(OC_User::getUser()))){
        OC_JSON::error(array("data" => array( "message" => "Authentication error" )));
        exit();
  }