gunnar: server/patches/horde HK-GW-framework_3.2_RC1-Fbview_xfb_concept.patch, NONE, 1.1 HK-GW-kronolith_2.2_RC1-Fbview_menu.patch, NONE, 1.1 HK-GW-kronolith_2.2_RC1-Fbview_relevance.patch, NONE, 1.1 HK-GW-kronolith_2.2_RC1-Fbview_xfb_access.patch, NONE, 1.1 README_Fbview_menu.patch, NONE, 1.1 README_Fbview_relevance.patch, NONE, 1.1 README_Fbview_xfb_access.patch, NONE, 1.1 README_Fbview_xfb_concept.patch, NONE, 1.1

cvs at kolab.org cvs at kolab.org
Thu Nov 29 16:32:13 CET 2007


Author: gunnar

Update of /kolabrepository/server/patches/horde
In directory doto:/tmp/cvs-serv23106/patches/horde

Added Files:
	HK-GW-framework_3.2_RC1-Fbview_xfb_concept.patch 
	HK-GW-kronolith_2.2_RC1-Fbview_menu.patch 
	HK-GW-kronolith_2.2_RC1-Fbview_relevance.patch 
	HK-GW-kronolith_2.2_RC1-Fbview_xfb_access.patch 
	README_Fbview_menu.patch README_Fbview_relevance.patch 
	README_Fbview_xfb_access.patch README_Fbview_xfb_concept.patch 
Log Message:
Support for the extended free/busy concept.

--- NEW FILE: HK-GW-framework_3.2_RC1-Fbview_xfb_concept.patch ---
diff -r fce4450434a7 framework/Share/Share/kolab.php
--- a/framework/Share/Share/kolab.php	Thu Nov 29 14:45:46 2007 +0100
+++ b/framework/Share/Share/kolab.php	Thu Nov 29 14:49:04 2007 +0100
@@ -17,6 +17,13 @@ define('HORDE_ANNOT_SHARE_ATTR', HORDE_A
  * Marks a share without a name. These shares are still invalid
  */
 define('KOLAB_SHARE_INVALID', 'KOLAB_SHARE_INVALID');
+
+/**
+ * Kolab specific free/busy relevance
+ */
+define('KOLAB_FBRELEVANCE_ADMINS',  0);
+define('KOLAB_FBRELEVANCE_READERS', 1);
+define('KOLAB_FBRELEVANCE_NOBODY',  2);
 
 /**
  * Horde_Share_kolab:: provides the kolab backend for the horde share driver.
@@ -825,16 +832,135 @@ class Horde_Share_Object_kolab extends H
      */
     function isDefault()
     {
+        $type = $this->getType();
+        if (is_a($type, 'PEAR_Error')) {
+            return false;
+        }
+        return $type[1];
+    }
+
+    //FIXME: The following five functions (actually also most other things in this class
+    //       needs to go into Kolab/IMAP.php
+    /**
+     * Get the folder type
+     *
+     * @return mixed  Array containing the type and the default status or a PEAR_Error
+     *                if the folder annotation cannot be accessed.
+     */
+    function getType()
+    {
         $imap = &$this->_shareOb->getImap();
-        $annotation = $imap->getAnnotation(KOLAB_ANNOT_FOLDER_TYPE, 'value.shared', $this->_folder);
+        $annotation = $imap->getAnnotation(KOLAB_ANNOT_FOLDER_TYPE,
+                                           'value.shared', 
+                                           $this->_folder);
         if (is_a($annotation, 'PEAR_Error')) {
-            return false;
-        }
-        if (empty($annotation)) {
-            return false;
-        }
-        $type = explode('.', $annotation);
-        return (!empty($type[1]) && $type[1] == 'default');
+            return $annotation;
+        }
+        
+        if (!empty($annotation)) {
+            $default = false;
+            $subtype = '';
+            $type = explode('.', $annotation);
+            if (!empty($type[0])) {
+                $foldertype = $type[0];
+                if (!empty($type[1])) {
+                    $subtype = $type[1];
+                    if ($type[1] == 'default') {
+                        $default = true;
+                    }
+                }
+            }
+            return array($foldertype, $default, $subtype);
+        } else {
+            return PEAR::raiseError(sprintf(_("Unknown folder type for folder %s."), $this->_folder));
+        }
+    }
+
+    /**
+     * Get the free/busy relevance for this folder
+     *
+     * @return int  Value containing the FB_RELEVANCE.
+     */
+    function getFbrelevance()
+    {
+        $imap = &$this->_shareOb->getImap();
+        $entry = KOLAB_ANNOT_ROOT . 'incidences-for';
+
+        $annotation = $imap->getAnnotation($entry, 'value.shared', $this->_folder);
+        if (is_a($annotation, 'PEAR_Error') || empty($annotation)) {
+            return KOLAB_FBRELEVANCE_ADMINS;
+        }
+        switch ($annotation) {
+        case 'admins':
+            return KOLAB_FBRELEVANCE_ADMINS;
+        case 'readers':
+            return KOLAB_FBRELEVANCE_READERS;
+        case 'nobody':
+            return KOLAB_FBRELEVANCE_NOBODY;
+        default:
+            return KOLAB_FBRELEVANCE_ADMINS;
+        }
+    }
+
+    /**
+     * Set the free/busy relevance for this folder
+     *
+     * @param int $relevance Value containing the FB_RELEVANCE
+     *
+     * @return mixed  True on success or a PEAR_Error.
+     */
+    function setFbrelevance($relevance)
+    {
+        switch ($relevance) {
+        case KOLAB_FBRELEVANCE_ADMINS:
+            $value = 'admins';
+            break;
+        case KOLAB_FBRELEVANCE_READERS:
+            $value = 'readers';
+            break;
+        case KOLAB_FBRELEVANCE_NOBODY:
+            $value = 'nobody';
+            break;
+        default:
+            $value = 'admins';
+        }
+
+        $imap = &$this->_shareOb->getImap();
+        $entry = KOLAB_ANNOT_ROOT . 'incidences-for';
+        return $imap->setAnnotation($entry, array('value.shared' => $value), $this->_folder);
+    }
+
+    /**
+     * Get the extended free/busy access settings for this folder
+     *
+     * @return array  Array containing the users with access to the
+     *                extended information.
+     */
+    function getXfbaccess()
+    {
+        $imap = &$this->_shareOb->getImap();
+        $entry = KOLAB_ANNOT_ROOT . 'xfb-readable';
+
+        $annotation = $imap->getAnnotation($entry, 'value.shared', $this->_folder);
+        if (is_a($annotation, 'PEAR_Error') || empty($annotation)) {
+            return array();
+        }
+        return explode(' ', $annotation);
+    }
+
+    /**
+     * Set the extended free/busy access settings for this folder
+     *
+     * @param array $access  Array containing the users with access to the
+     *                      extended information.
+     *
+     * @return mixed  True on success or a PEAR_Error.
+     */
+    function setXfbaccess($access)
+    {
+        $imap = &$this->_shareOb->getImap();
+        $entry = KOLAB_ANNOT_ROOT . 'xfb-readable';
+        return $imap->setAnnotation($entry, array('value.shared' => join(' ', $access)), $this->_folder);
     }
 
     /**
@@ -910,13 +1036,18 @@ class Horde_Share_Object_kolab extends H
             break;
 
         case 'params':
-            $params = $this->getAttribute('params');
+            $params = @unserialize($this->getAttribute('params'));
             if (is_a($params, 'PEAR_Error') || $params == '') {
-                $params = serialize(array('source' => 'kolab',
-                                          'default' => $this->get('default'),
-                                          'name' => $this->get('name')));
-            }
-            $this->data['params'] = $params;
+                $params = array('source' => 'kolab',
+                                'default' => $this->get('default'),
+                                'name' => $this->get('name'));
+            }
+            $type = $this->getType();
+            if (!is_a($type, 'PEAR_Error') && $type[0] == 'event') {
+                $params = array_merge($params, array('fbrelevance' => $this->getFbrelevance(),
+                                                     'xfbaccess'   => $this->getXfbaccess()));
+            }
+            $this->data['params'] = serialize($params);
             break;
 
         case 'default':
@@ -967,8 +1098,9 @@ class Horde_Share_Object_kolab extends H
             $value = unserialize($value);
             if (isset($value['default'])) {
                 $this->data['default'] = $value['default'];
-            }
-            break;
+                unset($value['default']);
+            }
+            $value = serialize($value);
 
         default:
             $this->data[$attribute] = $value;
@@ -1017,6 +1149,7 @@ class Horde_Share_Object_kolab extends H
                 }
             } elseif ($attribute == 'default') {
                 $imap = &$this->_shareOb->getImap();
+                //FIXME: Simplify with getType
                 $annotation = $imap->getAnnotation(KOLAB_ANNOT_FOLDER_TYPE, 'value.shared', $this->_folder);
                 if (is_a($annotation, 'PEAR_Error')) {
                     return $annotation;
@@ -1037,6 +1170,40 @@ class Horde_Share_Object_kolab extends H
                 continue;
             } elseif ($attribute == 'folder') {
                 continue;
+            } elseif ($attribute == 'params') {
+                $type = $this->getType();
+                if (!is_a($type, 'PEAR_Error') && $type[0] == 'event') {
+                    $params = @unserialize($value);
+                    if (isset($params['fbrelevance'])) {
+                        $result = $this->setFbrelevance($params['fbrelevance']);
+                        if (is_a($result, 'PEAR_Error')) {
+                            return $result;
+                        }
+                        unset($params['fbrelevance']);
+                    }
+                    if (isset($params['xfbaccess'])) {
+                        $result = $this->setXfbaccess($params['xfbaccess']);
+                        if (is_a($result, 'PEAR_Error')) {
+                            return $result;
+                        }
+                        unset($params['xfbaccess']);
+                    }
+
+                    if (empty($params)) {
+                        continue;
+                    }
+                    
+                    $value = @serialize($params);
+                }
+
+                $imap = &$this->_shareOb->getImap();
+                // setAnnotation apparently does not suppoort UTF-8 nor any special characters
+                $store = base64_encode($value);
+                $entry = HORDE_ANNOT_SHARE_ATTR . $attribute;
+                $result = $imap->setAnnotation($entry, array('value.shared' => $store), $this->_folder);
+                if (is_a($result, 'PEAR_Error')) {
+                    return $result;
+                }
             } else {
                 $imap = &$this->_shareOb->getImap();
                 // setAnnotation apparently does not suppoort UTF-8 nor any special characters

--- NEW FILE: HK-GW-kronolith_2.2_RC1-Fbview_menu.patch ---
diff -r 538d4c6293be kronolith/attendees.php
--- a/kronolith/attendees.php	Thu Nov 29 12:33:18 2007 +0100
+++ b/kronolith/attendees.php	Thu Nov 29 12:34:39 2007 +0100
@@ -236,6 +236,7 @@ Imple::factory('ContactAutoCompleter', a
 
 $title = _("Edit attendees");
 require KRONOLITH_TEMPLATES . '/common-header.inc';
+require KRONOLITH_TEMPLATES . '/fbview-menu.inc';
 
 if ($browser->hasFeature('javascript')) {
     Horde::addScriptFile('open_savedattlist_win.js');
diff -r 538d4c6293be kronolith/calendars.php
--- a/kronolith/calendars.php	Thu Nov 29 12:33:18 2007 +0100
+++ b/kronolith/calendars.php	Thu Nov 29 12:34:39 2007 +0100
@@ -134,6 +134,6 @@ Horde::addScriptFile('popup.js', 'horde'
 Horde::addScriptFile('popup.js', 'horde', true);
 $title = _("My Calendars");
 require KRONOLITH_TEMPLATES . '/common-header.inc';
-require KRONOLITH_TEMPLATES . '/menu.inc';
+require KRONOLITH_TEMPLATES . '/fbview-menu.inc';
 require KRONOLITH_TEMPLATES . '/calendars/calendars.inc';
 require $registry->get('templates', 'horde') . '/common-footer.inc';
diff -r 538d4c6293be kronolith/lib/Kronolith.php
--- a/kronolith/lib/Kronolith.php	Thu Nov 29 12:33:18 2007 +0100
+++ b/kronolith/lib/Kronolith.php	Thu Nov 29 12:34:39 2007 +0100
@@ -1968,6 +1968,33 @@ class Kronolith {
     }
 
     /**
+     * Builds Kronolith's list of menu items.
+     */
+    function getFbviewMenu($returnType = 'object')
+    {
+        global $conf, $registry, $browser, $prefs;
+
+        /* Check here for guest calendars so that we don't get multiple
+         * messages after redirects, etc. */
+        if (!Auth::getAuth() && !count($GLOBALS['all_calendars'])) {
+            $GLOBALS['notification']->push(_("No calendars are available to guests."));
+        }
+
+        require_once 'Horde/Menu.php';
+        $menu = new Menu(HORDE_MENU_MASK_HELP | HORDE_MENU_MASK_LOGIN);
+
+        $menu->add(Horde::applicationUrl('attendees.php'), _("Attendees"), 'attendees.png', null, null, null, '__noselection');
+
+        $menu->add(Horde::applicationUrl('calendars.php'), _("Calendars"), 'calendars.png', null, null, null, '__noselection');
+
+        if ($returnType == 'object') {
+            return $menu;
+        } else {
+            return $menu->render();
+        }
+    }
+
+    /**
      * Used with usort() to sort events based on their start times.
      * This function ignores the date component so recuring events can
      * be sorted correctly on a per day basis.
diff -r 538d4c6293be kronolith/templates/fbview-menu.inc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kronolith/templates/fbview-menu.inc	Thu Nov 29 12:34:39 2007 +0100
@@ -0,0 +1,4 @@
+<div id="menu">
+ <?php echo Kronolith::getFbviewMenu('string') ?>
+</div>
+<?php $GLOBALS['notification']->notify(array('listeners' => 'status')) ?>

--- NEW FILE: HK-GW-kronolith_2.2_RC1-Fbview_relevance.patch ---
Allows to set the free/busy relevance on a calendar.

diff -r e7fdad8797ac kronolith/calendars.php
--- a/kronolith/calendars.php	Thu Nov 29 14:36:50 2007 +0100
+++ b/kronolith/calendars.php	Thu Nov 29 14:43:24 2007 +0100
@@ -39,6 +39,7 @@ case 'save':
         $cal = $kronolith_shares->newShare(md5(microtime()));
         $cal->set('name', $id);
         $cal->set('desc', Util::getFormData('description', ''));
+        $cal->set('params', serialize(array('fbrelevance' => (int) Util::getFormData('fbrelevance', 0))));
         $result = $kronolith_shares->addShare($cal);
         if (is_a($result, 'PEAR_Error')) {
             $notification->push($result, 'horde.error');
@@ -50,6 +51,7 @@ case 'save':
         $original_name = $cal->get('name');
         $cal->set('name', $id);
         $cal->set('desc', Util::getFormData('description', ''));
+        $cal->set('params', serialize(array('fbrelevance' => (int) Util::getFormData('fbrelevance', 0))));
 
         if ($original_name != $id) {
             $result = $kronolith_driver->rename($original_name, $id);
@@ -125,9 +127,16 @@ case 'delete':
 $remote_calendars = unserialize($prefs->getValue('remote_cals'));
 $current_user = Auth::getAuth();
 $my_calendars = array();
+$fbrelevance = array();
 foreach (Kronolith::listCalendars() as $id => $cal) {
     if ($cal->get('owner') == $current_user) {
         $my_calendars[$id] = $cal;
+        $params = @unserialize($cal->get('params'));
+        if (isset($params['fbrelevance'])) {
+            $fbrelevance[$id] = $params['fbrelevance'];
+        } else {
+            $fbrelevance[$id] = 0;
+        }
     }
 }
 
diff -r e7fdad8797ac kronolith/templates/calendars/calendars.inc
--- a/kronolith/templates/calendars/calendars.inc	Thu Nov 29 14:36:50 2007 +0100
+++ b/kronolith/templates/calendars/calendars.inc	Thu Nov 29 14:43:24 2007 +0100
@@ -8,7 +8,8 @@ var fields = [];
 <?php foreach ($my_calendars as $id => $cal): ?>
 fields['<?php echo htmlspecialchars($id) ?>'] = [
         "<?php echo rawurlencode(String::convertCharset($cal->get('name'), NLS::getCharset(), 'UTF-8')) ?>",
-        "<?php echo rawurlencode(String::convertCharset($cal->get('desc'), NLS::getCharset(), 'UTF-8')) ?>"];
+        "<?php echo rawurlencode(String::convertCharset($cal->get('desc'), NLS::getCharset(), 'UTF-8')) ?>",
+        "<?php echo $fbrelevance[$id] ?>"];
 <?php endforeach; ?>
 
 function newChoice()
@@ -25,6 +26,7 @@ function newChoice()
         document.shares.edit_share.value = share;
         document.shares.id.value = decodeURIComponent(fields[share][0]);
         document.shares.description.value = decodeURIComponent(fields[share][1]);
+        document.shares.fbrelevance[fields[share][2]].checked = true;
         urlObj.innerHTML = "<?php echo Util::addParameter(Horde::applicationUrl('month.php', true, -1), 'display_cal', '') ?>" + share;
         subscriptionUrlObj.innerHTML = "<?php echo $webdav ? (Horde::url($registry->get('webroot', 'horde'), true, -1) . '/rpc.php/kronolith/" + share + ".ics"') : Util::addParameter(Horde::applicationUrl('ics.php', true, -1), 'c', '') . '" + share' ?>;
     }
@@ -126,11 +128,55 @@ function checkSubmit()
    <textarea id="description" name="description" rows="4" cols="60"></textarea>
   </td>
  </tr>
- <tr>
-  <td valign="top" class="nowrap rightAlign">
+</table>
+
+<div class="control">
+ <?php echo _("Free/Busy relevance") ?>
+</div>
+
+<table width="100%" cellspacing="0">
+ <tr>
+  <td colspan="2">
+   <?php echo _("This calendar is only included into the free/busy data for ...") ?>
+  </td>
+ </tr>
+ <tr>
+  <td width="15%" class="nowrap rightAlign">
+   <strong><?php echo _("owners/administrators") ?></strong> 
+  </td>
+  <td width="85%">
+   <input id="admins" name="fbrelevance" type="radio" class="checkbox" value="0"/><br />
+  </td>
+ </tr>
+ <tr>
+  <td valign="top" class="nowrap rightAlign">
+   <strong><?php echo _("readers") ?></strong> 
+  </td>
+  <td>
+   <input id="readers" name="fbrelevance" type="radio" class="checkbox" value="1"/>
+  </td>
+ </tr>
+ <tr>
+  <td valign="top" class="nowrap rightAlign">
+   <strong><?php echo _("no one") ?></strong> 
+  </td>
+  <td>
+   <input id="none" name="fbrelevance" type="radio" class="checkbox" value="2"/><br />
+  </td>
+ </tr>
+  <td>
+</table>
+
+<div class="control">
+ <?php echo _("Calendar links:") ?>
+</div>
+
+<table width="100%" cellspacing="0">
+ <tr>
+  <td width="15%" class="nowrap rightAlign">
    <strong><?php echo _("URL") ?></strong> 
   </td>
-  <td>
+  <td width="85%">
    <span id="calendar_url"><em><?php echo _("Select a calendar above to display the URL") ?></em></span>
   </td>
  </tr>

--- NEW FILE: HK-GW-kronolith_2.2_RC1-Fbview_xfb_access.patch ---
diff -r 14457cf2ea2c kronolith/perms.php
--- a/kronolith/perms.php	Thu Nov 29 15:20:49 2007 +0100
+++ b/kronolith/perms.php	Thu Nov 29 15:25:36 2007 +0100
@@ -15,6 +15,34 @@ require_once KRONOLITH_BASE . '/lib/base
 require_once KRONOLITH_BASE . '/lib/base.php';
 require_once 'Horde/Group.php';
 
+function &getFbperms($share) 
+{
+    $fbperms = array();
+    $params = $share->get('params');
+    if (!is_a($params, 'PEAR_Error')) {
+        $params = @unserialize($params);
+        if (isset($params['xfbaccess'])) {
+            $xfbusers = $params['xfbaccess'];
+            foreach ($xfbusers as $user) {
+                $fbperms[$user] = PERMS_READ;
+            }
+        }
+    }
+    return $fbperms;
+}
+
+function setFbperms($share, $xfbusers)
+{
+    $fbperms = array();
+    $params = $share->get('params');
+    if (!is_a($params, 'PEAR_Error')) {
+        $params = @unserialize($params);
+        $params['xfbaccess'] = $xfbusers;
+        $params = serialize($params);
+        $share->set('params', $params);
+    }
+}
+
 $shares = &Horde_Share::singleton('kronolith');
 $groups = &Group::singleton();
 $auth = &Auth::singleton($conf['auth']['driver']);
@@ -36,6 +64,8 @@ case 'edit':
         $notification->push($share, 'horde.error');
     } elseif (isset($share) && Auth::getAuth() != $share->get('owner')) {
         exit('permission denied');
+    } else {
+        $fbperms = getFbperms($share);
     }
     break;
 
@@ -251,6 +281,24 @@ case 'editform':
             }
         }
 
+        // Process free/busy permissions.
+        $fb_names = Util::getFormData('fb_names');
+        $fb_read = Util::getFormData('fb_read');
+
+        $fbperms = getFbperms($share);
+        foreach ($fb_names as $key => $user) {
+            if (empty($user)) {
+                continue;
+            }
+
+            if (!empty($fb_read[$key])) {
+                $fbperms[$user] = PERMS_READ;
+            } else {
+                unset($fbperms[$user]);
+            }
+        }
+        setFbperms($share, array_keys($fbperms));
+
         $share->setPermission($perm, false);
         $share->save();
         $notification->push(sprintf(_("Updated \"%s\"."), $share->get('name')), 'horde.success');
diff -r 14457cf2ea2c kronolith/templates/perms/perms.inc
--- a/kronolith/templates/perms/perms.inc	Thu Nov 29 15:20:49 2007 +0100
+++ b/kronolith/templates/perms/perms.inc	Thu Nov 29 15:25:36 2007 +0100
@@ -355,6 +355,61 @@
   <td> </td>
 </tr>
 
+<!-- Extended free/busy Permissions -->
+<tr valign="middle">
+  <td class="header leftAlign">
+    <?php echo Horde::img('user.png', '', '', $registry->getImageDir('horde')) . ' ' . _("Extended free/busy access") ?>
+  </td>
+  <td class="header" align="center"> </td>
+  <td class="header" align="center"><?php echo _("Read") ?></td>
+  <td class="header" align="center"> </td>
+  <td class="header" align="center"> </td>
+  <td class="header" align="center"> </td>
+  <td class="header"> </td>
+</tr>
+<?php foreach ($fbperms as $user => $fbperm) { if ($user != $owner) { ?>
+<tr>
+  <td class="light"><?php echo htmlspecialchars(Auth::removeHook($user)) ?><input type="hidden" name="fb_names[<?php echo htmlspecialchars($user) ?>]" value="<?php echo htmlspecialchars($user) ?>" /></td>
+  <td align="center"> </td>
+  <td align="center">
+    <input type="checkbox" id="fb_read_<?php echo str_replace('@', '_', htmlspecialchars($user)) ?>" name="fb_read[<?php echo htmlspecialchars($user) ?>]"<?php echo ($fbperm & PERMS_READ) ? ' checked="checked"' : '' ?> />
+    <label for="fb_read_<?php echo str_replace('@', '_', htmlspecialchars($user)) ?>" class="hidden"><?php echo _("Read") ?></label>
+  </td>
+  <td align="center"> </td>
+  <td align="center"> </td>
+  <td align="center"> </td>
+  <td> </td>
+</tr>
+<?php } } ?>
+<!-- New extended free/busy row -->
+<tr>
+<?php if ($auth->hasCapability('list')): ?>
+  <td class="light">
+    <label for="fb_names_new" class="hidden"><?php echo _("Select a user to add:") ?></label>
+    <select id="fb_names_new" name="fb_names[||new]">
+      <option value=""><?php echo _("Select a user to add:") ?></option>
+    <?php foreach ($userList as $user) { if (!isset($userperms[$user])) { ?>
+      <option value="<?php echo htmlspecialchars($user) ?>"><?php echo htmlspecialchars(Auth::removeHook($user)) ?></option>
+    <?php } } ?>
+    </select>
+  </td>
+<?php else: ?>
+  <td class="light">
+    <label for="fb_names_new" class="hidden"><?php echo _("User to add:") ?></label>
+    <input type="text" id="fb_names_new" name="fb_names[||new]" />
+  </td>
+<?php endif; ?>
+  <td align="center"> </td>
+  <td align="center">
+    <input type="checkbox" id="fb_read_new" name="fb_read[||new]" />
+    <label for="fb_read_new" class="hidden"><?php echo _("Read") ?></label>
+  </td>
+  <td align="center"> </td>
+  <td align="center"> </td>
+  <td align="center"> </td>
+  <td> </td>
+</tr>
+
 <tr>
  <td colspan="7"> </td>
 </tr>

--- NEW FILE: README_Fbview_menu.patch ---
DESCRIPTION:

Adds a reduced menu to the attendees view. This won't make it upstream
since the the view is used by upstream as a popup and does not need a
menu.

IMPACT:

The menu will be missing in fbview.

REFERENCES:

Mercurial patch repository:

http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary

HISTORY


--- NEW FILE: README_Fbview_relevance.patch ---
DESCRIPTION:

Allows to set the free/busy relevance of a calendar. This is Kolab
specific and won't make it upstream in this form.

IMPACT:

Without this patch you won't be able to set the free/busy relevance of
a calendar in fbview.

REFERENCES:

Mercurial patch repository:

http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary

HISTORY


--- NEW FILE: README_Fbview_xfb_access.patch ---
DESCRIPTION:

Allows to set the access rules for extended free busy parameters.
This is Kolab specific and won't make it upstream in this form.

IMPACT:

Without this patch you won't be able to modify the access rights in
fbview.

REFERENCES:

Mercurial patch repository:

http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary

HISTORY


--- NEW FILE: README_Fbview_xfb_concept.patch ---
DESCRIPTION:

Adds routines in the Horde::Share library to store the free/busy
relevance and the free/busy access settings.  This could be submitted
upstream after some restructuring.

IMPACT:

Setting/Getting these parameters won't work in fbview.

REFERENCES:

Mercurial patch repository:

http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary

HISTORY






More information about the commits mailing list