fmsystem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Fmsystem-commits] [11620] Merge 11614:11619 from trunk


From: Sigurd Nes
Subject: [Fmsystem-commits] [11620] Merge 11614:11619 from trunk
Date: Wed, 22 Jan 2014 17:26:10 +0000

Revision: 11620
          http://svn.sv.gnu.org/viewvc/?view=rev&root=fmsystem&revision=11620
Author:   sigurdne
Date:     2014-01-22 17:26:09 +0000 (Wed, 22 Jan 2014)
Log Message:
-----------
Merge 11614:11619 from trunk

Modified Paths:
--------------
    branches/Version-1_0-branch/phpgwapi/setup/setup.inc.php
    branches/Version-1_0-branch/phpgwapi/setup/tables_current.inc.php
    branches/Version-1_0-branch/phpgwapi/setup/tables_update.inc.php
    branches/Version-1_0-branch/property/inc/export/default/Agresso_X114

Added Paths:
-----------
    branches/Version-1_0-branch/phpgwapi/inc/class.vfs_braArkiv.inc.php
    
branches/Version-1_0-branch/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php

Property Changed:
----------------
    branches/Version-1_0-branch/


Property changes on: branches/Version-1_0-branch
___________________________________________________________________
Modified: svn:mergeinfo
   - 
/trunk:6439-6441,6443,6445-6447,6449-6464,6466-6468,6470-6474,6476-6477,6479-6480,6483-6488,6490-6491,6493-6494,6496-6501,6503-6504,6506,6508,6510-6511,6513,6515-6516,6518,6520-6524,6526-6528,6533-6534,6536-6541,6543-6565,6567,6569,6571-6576,6578,6580-6586,6588-6596,6598-6600,6602-6604,6606-6607,6609-6611,6613-6625,6629-6639,6641-6643,6645-6646,6648,6650-6654,6656-6659,6661-6663,6665-6666,6668-6669,6672-6673,6675,6677-6678,6680,6682-6686,6688-6717,6719,6721-6722,6724-6728,6730,6732-6734,6736-6739,6741,6743,6745-6746,6748-6756,6758-6762,6764,6766-6788,6790,6792-6798,6800-6814,6816-6819,6821-6822,6824-6826,6828-6837,6839,6841,6843-6849,6851,6853-6869,6871-6874,6876-6877,6879,6881,6883,6885-6886,6888-6893,6895-6897,6899-6901,6903,6905-6907,6909,6911-6929,6931-6936,6938-6947,6949,6951,6953,6955-6956,6958-6959,6961-6968,6970-6971,6973-6974,6976-6978,6980,6982-7017,7019-7025,7027-7035,7037-7039,7041-7045,7047-7055,7057,7059-7065,7067-7069,7071,7073,7075-7076,7078,7080-7081,7083,7085,7087,7089-7097,7099-7102,7104-7105,7107-7111,7113-7120,7122-7124,7126-7129,7131,7133-7141,7143,7145-7146,7148-7150,7152-7153,7155-7158,7160-7164,7166-7167,7169-7170,7172,7174,7176,7178,7180-7181,7183,7185,7187-7188,7190,7192-7196,7198-7199,7201-7203,7205,7207,7209-7210,7212,7214,7216-7217,7219-7222,7224-7226,7228-7229,7231,7233-7234,7236-7238,7240-7241,7243-7244,7246,7248,7250,7252-7256,7258-7259,7261-7264,7266-7273,7275-7279,7281-7332,7334-7338,7340-7348,7350,7352-7353,7355-7361,7363-7366,7368-7370,7372,7374,7376,7378,7380-7386,7388-7400,7402,7404-7433,7435-7439,7441-7446,7448-7458,7460-7469,7471-7483,7485-7487,7489-7490,7492,7494,7496-7497,7499,7501-7502,7504,7506-7507,7509-7511,7513-7517,7519-7521,7523,7525,7527-7529,7531,7533,7535-7538,7540-7542,7544-7549,7551-7552,7554-7561,7563,7565,7567-7573,7575-7578,7580-7584,7586-7591,7593-7624,7627-7636,7638-7656,7658-7718,7720-7732,7734,7736,7738-7750,7754-7759,7761-7767,7769-7780,7782,7784-7809,7811-7812,7814-7835,7837-7847,7849-7887,7889-7895,7897,7899,7901,7903-7905,7907-7921,7923-7925,7927-7933,7935,7937-7952,7954-7968,7970-7974,7976,7978-7979,7981-7982,7984-7988,7990-7992,7994-8041,8043-8066,8068-8087,8089,8091-8108,8110-8124,8126-8129,8131,8133-8150,8152-8154,8156-8162,8164-8167,8169-8170,8172-8179,8181,8183-8196,8198-8207,8209-8211,8213-8214,8216-8217,8219-8220,8222,8224-8225,8227-8247,8249,8251,8253-8282,8284-8352,8354-8368,8370-8396,8398-8430,8432,8434-8440,8442-8445,8447-8453,8455-8456,8458,8460,8462-8464,8466-8473,8475-8479,8481,8483-8501,8503-8523,8525,8527-8531,8533,8535-8536,8538-8550,8552-8554,8556-8557,8559-8579,8581-8587,8589,8591-8592,8594-8595,8597-8601,8603-8610,8612-8613,8615,8617,8619-8645,8647-8650,8652-8661,8663-8666,8668-8669,8671-8683,8685-8691,8693-8730,8732-8737,8739,8741-8767,8769,8771-8772,8774,8776-8797,8799-8812,8814-8819,8821,8823-8833,8835-8837,8839,8841,8843-8849,8852-8858,8860-8867,8869-8870,8872,8874-8877,8879,8881,8883-8888,8890,8892-8901,8903-8911,8913-8917,8920-8923,8925-8933,8935-8938,8940-8943,8945,8947-8948,8950,8952-8953,8955-8962,8964,8966,8968-8970,8972-8975,8977-8983,8985-8993,8995-9001,9003,9005,9007,9009,9011-9019,9021-9023,9025,9027-9028,9030-9044,9046-9047,9049-9050,9052-9056,9058-9059,9061,9063-9064,9066-9068,9071-9092,9094-9112,9114-9117,9119,9121-9160,9162-9166,9169-9207,9209-9211,9213-9215,9217,9219,9221-9253,9255,9257,9259-9260,9262,9264-9269,9271-9273,9275,9277-9278,9280,9282-9283,9285-9289,9291-9299,9301-9310,9312-9313,9315-9320,9322-9324,9326-9338,9340-9342,9344,9346-9348,9350-9358,9360-9362,9364-9366,9368-9374,9376-9382,9384,9386,9388-9390,9392-9396,9398-9402,9404-9410,9412,9414,9416-9417,9419-9425,9427,9429-9430,9432,9434-9463,9465-9502,9504-9506,9508-9521,9523-9526,9528,9530-9537,9539,9541-9551,9553,9555-9556,9558-9578,9580-9581,9583,9585,9587,9589,9591-9624,9626-9655,9657-9700,9702-9726,9728-9729,9731-9749,9751,9753-9754,9756-9832,9834-9836,9838-9839,9841-9846,9848-9850,9852-9858,9860-9863,9865,9867,9869-9871,9873-9893,9895,9897-9912,9914-9919,9921-9928,9930-9952,9954,9956,9958-9963,9965-9993,9995-9997,9999-10001,10003-10004,10006-10007,10009-10012,10014-10031,10033-10073,10075-10107,10109-10165,10167-10210,10222-10226,10228-10311,10313-10378,10380,10382,10384-10393,10395-10478,10480-10482,10484-10494,10496-10503,10505,10507,10509-10521,10523,10525-10528,10530-10540,10542-10543,10545-10568,10570-10584,10586-10590,10592-10594,10596,10598-10599,10601-10611,10613,10615,10617-10626,10628-10636,10638,10640-10654,10656-10658,10660,10662-10672,10674,10676-10682,10684,10686,10688-10690,10692-10694,10696-10697,10699-10701,10703,10705-10706,10708-10724,10726-10731,10734,10736-10748,10750-10796,10798-10939,10941,10943,10945,10947-10953,10955,10957-10961,10963,10965-10966,10968-11001,11003-11030,11032-11034,11036,11038,11040,11042-11053,11055-11059,11061-11062,11064-11068,11070-11073,11075-11077,11079-11083,11085,11087-11088,11090-11093,11095-11108,11110-11111,11113,11115-11116,11118-11120,11122,11124-11129,11131-11132,11134,11136,11138,11140-11151,11153-11161,11163-11185,11187-11189,11191-11229,11231,11233,11235-11264,11266-11267,11269-11278,11280-11282,11284-11291,11293-11295,11297,11299-11302,11304,11306,11309,11311,11313-11316,11318-11323,11325-11332,11334,11336-11344,11346,11348-11354,11356,11358-11360,11363-11386,11388-11389,11391-11392,11394,11396-11403,11405-11406,11408,11410,11412,11415,11417,11419-11420,11422,11424-11429,11431-11442,11444-11445,11447-11460,11462-11464,11466-11470,11472-11475,11477-11478,11480-11487,11489-11492,11494,11496,11498,11500-11502,11504-11506,11508,11510-11511,11513,11515,11517-11523,11525-11526,11528-11531,11533,11535-11538,11540-11546,11548-11560,11563-11572,11574,11576,11578,11580-11581,11583,11585,11587,11589-11592,11594-11595,11597,11599,11601,11603,11605-11607,11609-11611,11613
   + 
/trunk:6439-6441,6443,6445-6447,6449-6464,6466-6468,6470-6474,6476-6477,6479-6480,6483-6488,6490-6491,6493-6494,6496-6501,6503-6504,6506,6508,6510-6511,6513,6515-6516,6518,6520-6524,6526-6528,6533-6534,6536-6541,6543-6565,6567,6569,6571-6576,6578,6580-6586,6588-6596,6598-6600,6602-6604,6606-6607,6609-6611,6613-6625,6629-6639,6641-6643,6645-6646,6648,6650-6654,6656-6659,6661-6663,6665-6666,6668-6669,6672-6673,6675,6677-6678,6680,6682-6686,6688-6717,6719,6721-6722,6724-6728,6730,6732-6734,6736-6739,6741,6743,6745-6746,6748-6756,6758-6762,6764,6766-6788,6790,6792-6798,6800-6814,6816-6819,6821-6822,6824-6826,6828-6837,6839,6841,6843-6849,6851,6853-6869,6871-6874,6876-6877,6879,6881,6883,6885-6886,6888-6893,6895-6897,6899-6901,6903,6905-6907,6909,6911-6929,6931-6936,6938-6947,6949,6951,6953,6955-6956,6958-6959,6961-6968,6970-6971,6973-6974,6976-6978,6980,6982-7017,7019-7025,7027-7035,7037-7039,7041-7045,7047-7055,7057,7059-7065,7067-7069,7071,7073,7075-7076,7078,7080-7081,7083,7085,7087,7089-7097,7099-7102,7104-7105,7107-7111,7113-7120,7122-7124,7126-7129,7131,7133-7141,7143,7145-7146,7148-7150,7152-7153,7155-7158,7160-7164,7166-7167,7169-7170,7172,7174,7176,7178,7180-7181,7183,7185,7187-7188,7190,7192-7196,7198-7199,7201-7203,7205,7207,7209-7210,7212,7214,7216-7217,7219-7222,7224-7226,7228-7229,7231,7233-7234,7236-7238,7240-7241,7243-7244,7246,7248,7250,7252-7256,7258-7259,7261-7264,7266-7273,7275-7279,7281-7332,7334-7338,7340-7348,7350,7352-7353,7355-7361,7363-7366,7368-7370,7372,7374,7376,7378,7380-7386,7388-7400,7402,7404-7433,7435-7439,7441-7446,7448-7458,7460-7469,7471-7483,7485-7487,7489-7490,7492,7494,7496-7497,7499,7501-7502,7504,7506-7507,7509-7511,7513-7517,7519-7521,7523,7525,7527-7529,7531,7533,7535-7538,7540-7542,7544-7549,7551-7552,7554-7561,7563,7565,7567-7573,7575-7578,7580-7584,7586-7591,7593-7624,7627-7636,7638-7656,7658-7718,7720-7732,7734,7736,7738-7750,7754-7759,7761-7767,7769-7780,7782,7784-7809,7811-7812,7814-7835,7837-7847,7849-7887,7889-7895,7897,7899,7901,7903-7905,7907-7921,7923-7925,7927-7933,7935,7937-7952,7954-7968,7970-7974,7976,7978-7979,7981-7982,7984-7988,7990-7992,7994-8041,8043-8066,8068-8087,8089,8091-8108,8110-8124,8126-8129,8131,8133-8150,8152-8154,8156-8162,8164-8167,8169-8170,8172-8179,8181,8183-8196,8198-8207,8209-8211,8213-8214,8216-8217,8219-8220,8222,8224-8225,8227-8247,8249,8251,8253-8282,8284-8352,8354-8368,8370-8396,8398-8430,8432,8434-8440,8442-8445,8447-8453,8455-8456,8458,8460,8462-8464,8466-8473,8475-8479,8481,8483-8501,8503-8523,8525,8527-8531,8533,8535-8536,8538-8550,8552-8554,8556-8557,8559-8579,8581-8587,8589,8591-8592,8594-8595,8597-8601,8603-8610,8612-8613,8615,8617,8619-8645,8647-8650,8652-8661,8663-8666,8668-8669,8671-8683,8685-8691,8693-8730,8732-8737,8739,8741-8767,8769,8771-8772,8774,8776-8797,8799-8812,8814-8819,8821,8823-8833,8835-8837,8839,8841,8843-8849,8852-8858,8860-8867,8869-8870,8872,8874-8877,8879,8881,8883-8888,8890,8892-8901,8903-8911,8913-8917,8920-8923,8925-8933,8935-8938,8940-8943,8945,8947-8948,8950,8952-8953,8955-8962,8964,8966,8968-8970,8972-8975,8977-8983,8985-8993,8995-9001,9003,9005,9007,9009,9011-9019,9021-9023,9025,9027-9028,9030-9044,9046-9047,9049-9050,9052-9056,9058-9059,9061,9063-9064,9066-9068,9071-9092,9094-9112,9114-9117,9119,9121-9160,9162-9166,9169-9207,9209-9211,9213-9215,9217,9219,9221-9253,9255,9257,9259-9260,9262,9264-9269,9271-9273,9275,9277-9278,9280,9282-9283,9285-9289,9291-9299,9301-9310,9312-9313,9315-9320,9322-9324,9326-9338,9340-9342,9344,9346-9348,9350-9358,9360-9362,9364-9366,9368-9374,9376-9382,9384,9386,9388-9390,9392-9396,9398-9402,9404-9410,9412,9414,9416-9417,9419-9425,9427,9429-9430,9432,9434-9463,9465-9502,9504-9506,9508-9521,9523-9526,9528,9530-9537,9539,9541-9551,9553,9555-9556,9558-9578,9580-9581,9583,9585,9587,9589,9591-9624,9626-9655,9657-9700,9702-9726,9728-9729,9731-9749,9751,9753-9754,9756-9832,9834-9836,9838-9839,9841-9846,9848-9850,9852-9858,9860-9863,9865,9867,9869-9871,9873-9893,9895,9897-9912,9914-9919,9921-9928,9930-9952,9954,9956,9958-9963,9965-9993,9995-9997,9999-10001,10003-10004,10006-10007,10009-10012,10014-10031,10033-10073,10075-10107,10109-10165,10167-10210,10222-10226,10228-10311,10313-10378,10380,10382,10384-10393,10395-10478,10480-10482,10484-10494,10496-10503,10505,10507,10509-10521,10523,10525-10528,10530-10540,10542-10543,10545-10568,10570-10584,10586-10590,10592-10594,10596,10598-10599,10601-10611,10613,10615,10617-10626,10628-10636,10638,10640-10654,10656-10658,10660,10662-10672,10674,10676-10682,10684,10686,10688-10690,10692-10694,10696-10697,10699-10701,10703,10705-10706,10708-10724,10726-10731,10734,10736-10748,10750-10796,10798-10939,10941,10943,10945,10947-10953,10955,10957-10961,10963,10965-10966,10968-11001,11003-11030,11032-11034,11036,11038,11040,11042-11053,11055-11059,11061-11062,11064-11068,11070-11073,11075-11077,11079-11083,11085,11087-11088,11090-11093,11095-11108,11110-11111,11113,11115-11116,11118-11120,11122,11124-11129,11131-11132,11134,11136,11138,11140-11151,11153-11161,11163-11185,11187-11189,11191-11229,11231,11233,11235-11264,11266-11267,11269-11278,11280-11282,11284-11291,11293-11295,11297,11299-11302,11304,11306,11309,11311,11313-11316,11318-11323,11325-11332,11334,11336-11344,11346,11348-11354,11356,11358-11360,11363-11386,11388-11389,11391-11392,11394,11396-11403,11405-11406,11408,11410,11412,11415,11417,11419-11420,11422,11424-11429,11431-11442,11444-11445,11447-11460,11462-11464,11466-11470,11472-11475,11477-11478,11480-11487,11489-11492,11494,11496,11498,11500-11502,11504-11506,11508,11510-11511,11513,11515,11517-11523,11525-11526,11528-11531,11533,11535-11538,11540-11546,11548-11560,11563-11572,11574,11576,11578,11580-11581,11583,11585,11587,11589-11592,11594-11595,11597,11599,11601,11603,11605-11607,11609-11611,11613,11615-11619

Copied: branches/Version-1_0-branch/phpgwapi/inc/class.vfs_braArkiv.inc.php 
(from rev 11619, trunk/phpgwapi/inc/class.vfs_braArkiv.inc.php)
===================================================================
--- branches/Version-1_0-branch/phpgwapi/inc/class.vfs_braArkiv.inc.php         
                (rev 0)
+++ branches/Version-1_0-branch/phpgwapi/inc/class.vfs_braArkiv.inc.php 
2014-01-22 17:26:09 UTC (rev 11620)
@@ -0,0 +1,2846 @@
+<?php
+       /**
+       * Virtual File System with SQL backend
+       * @author Jason Wies <address@hidden>
+       * @author Giancarlo Susin
+       * @copyright Copyright(C) 2001 Jason Wies
+       * @copyright Copyright(C) 2004 Free Software Foundation, Inc. 
http://www.fsf.org/
+       * @license http://www.fsf.org/licenses/lgpl.html GNU Lesser General 
Public License
+       * @package phpgwapi
+       * @subpackage vfs
+       * @version $Id: class.vfs_sql.inc.php 11334 2013-09-26 18:13:25Z 
sigurdne $
+       */
+
+       /**
+       * VFS SQL select
+       * @see extra_sql()
+       */
+       define('VFS_SQL_SELECT', 1);
+       /**
+       * VFS SQL delete
+       * @see extra_sql()
+       */
+       define('VFS_SQL_DELETE', 2);
+       /**
+       * VFS SQL update
+       * @see extra_sql()
+       */
+       define('VFS_SQL_UPDATE', 4);
+
+
+       /**
+       * Virtual File System with SQL backend
+       *
+       * @package phpgwapi
+       * @subpackage vfs
+       * @ignore
+       */
+       class phpgwapi_vfs extends phpgwapi_vfs_shared
+       {
+               var $file_actions;
+               var $acl_default;
+
+               /**
+                * constructor, sets up variables
+               *
+                */
+               function __construct()
+               {
+                       parent::__construct();
+                       /*
+                          File/dir attributes, each corresponding to a 
database field.  Useful for use in loops
+                          If an attribute was added to the table, add it here 
and possibly add it to
+                          set_attributes()
+
+                          set_attributes now uses this array().   07-Dec-01 
skeeter
+                       */
+
+                       $this->attributes[] = 'deleteable';
+                       $this->attributes[] = 'content';
+
+                       /*
+                          Decide whether to use any actual filesystem 
calls(fopen(), fread(),
+                          unlink(), rmdir(), touch(), etc.).  If not, then 
we're working completely
+                          in the database.
+                       */
+                       $conf = CreateObject('phpgwapi.config', 'phpgwapi');
+                       $conf->read();
+                       if($conf->config_data['file_store_contents'] == 
'filesystem' || !$conf->config_data['file_store_contents'])
+                       {
+                               $this->file_actions = 1;
+                       }
+                       else
+                       {
+                               $this->file_actions = 0;
+                       }
+
+                       $this->acl_default = $conf->config_data['acl_default'];
+
+                       // test if the files-dir is inside the document-root, 
and refuse working if so
+                       //
+                       if($this->file_actions && 
$this->in_docroot($this->basedir))
+                       {
+                               $GLOBALS['phpgw']->common->phpgw_header();
+                               if($GLOBALS['phpgw_info']['flags']['noheader'])
+                               {
+                                       echo parse_navbar();
+                               }
+                               echo '<p align="center"><font 
color="red"><b>'.lang('Path to user and group files HAS TO BE OUTSIDE of the 
webservers document-root!!!')."</b></font></p>\n";
+                               $GLOBALS['phpgw']->common->phpgw_exit();
+                       }
+
+                       /* We store the linked directories in an array now, so 
we don't have to make the SQL call again */
+                       if($GLOBALS['phpgw_info']['server']['db_type']=='mssql'
+                               || 
$GLOBALS['phpgw_info']['server']['db_type']=='sybase')
+                       {
+                               $query = $GLOBALS['phpgw']->db->query("SELECT 
directory, name, link_directory, link_name"
+                               . " FROM phpgw_vfs WHERE 
CONVERT(varchar,link_directory) != ''"
+                               . " AND CONVERT(varchar,link_name) != ''" . 
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__,__FILE__);
+                       }
+                       else
+                       {
+                               $query = $GLOBALS['phpgw']->db->query("SELECT 
directory, name, link_directory, link_name"
+                               . " FROM phpgw_vfs WHERE(link_directory IS NOT 
NULL or link_directory != '')"
+                               . " AND(link_name IS NOT NULL or link_name != 
'')" . $this->extra_sql(array('query_type' => VFS_SQL_SELECT)), 
__LINE__,__FILE__);
+                       }
+
+                       $this->linked_dirs = array();
+                       while($GLOBALS['phpgw']->db->next_record())
+                       {
+                               $this->linked_dirs[] = $this->Record();
+                       }
+
+                       $this->fileoperation = 
CreateObject('phpgwapi.vfs_fileoperation_braArkiv');
+
+               }
+
+               /**
+                * test if $path lies within the webservers document-root
+               *
+                */
+               function in_docroot($path)
+               {
+                       //$docroots = array(PHPGW_SERVER_ROOT, 
$_SERVER['DOCUMENT_ROOT']);
+                       $docroots = array(PHPGW_SERVER_ROOT);
+                       //in case vfs is called from cli(cron-job)
+
+                       if($_SERVER['DOCUMENT_ROOT'])
+                       {
+                               $docroots[] = $_SERVER['DOCUMENT_ROOT'];
+                       }
+
+                       foreach($docroots as $docroot)
+                       {
+                               $len = strlen($docroot);
+
+                               if($docroot == substr($path,0,$len))
+                               {
+                                       $rest = substr($path,$len);
+
+                                       if(!strlen($rest) || $rest[0] == 
DIRECTORY_SEPARATOR)
+                                       {
+                                               return true;
+                                       }
+                               }
+                       }
+                       return false;
+               }
+
+               /**
+                * Return extra SQL code that should be appended to certain 
queries
+               *
+                * @param query_type The type of query to get extra SQL code 
for, in the form of a VFS_SQL define
+                * @return Extra SQL code
+                */
+               function extra_sql($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array('query_type' => VFS_SQL_SELECT);
+                       }
+
+                       if($data['query_type'] == VFS_SQL_SELECT || 
$data['query_type'] == VFS_SQL_DELETE || $data['query_type'] = VFS_SQL_UPDATE)
+                       {
+                               $sql = ' AND((';
+
+                               reset($this->meta_types);
+                               while(list($num, $type) = 
each($this->meta_types))
+                               {
+                                       if($num)
+                                       {
+                                               $sql .= ' AND ';
+                                       }
+
+                                       $sql .= "mime_type != '{$type}'";
+                               }
+                               $sql .= ') OR mime_type IS NULL)';
+                       }
+
+                       return($sql);
+               }
+
+               /**
+                * Add a journal entry after(or before) completing an operation,
+               *
+                *        and increment the version number.  This function 
should be used internally only
+                * Note that state_one and state_two are ignored for some 
VFS_OPERATION's, for others
+                *               * they are required.  They are ignored for any 
"custom" operation
+                *               * The two operations that require state_two:
+                *               * operation             *      state_two
+                *               * VFS_OPERATION_COPIED fake_full_path of 
copied to
+                *               * VFS_OPERATION_MOVED           * 
fake_full_path of moved to
+
+                *               * If deleting, you must call add_journal() 
before you delete the entry from the database
+                * @param string File or directory to add entry for
+                * @param relatives Relativity array
+                * @param operation The operation that was performed.  Either a 
VFS_OPERATION define or
+                *               *   a non-integer descriptive text string
+                * @param state_one The first "state" of the file or directory. 
 Can be a file name, size,
+                *               *   location, whatever is appropriate for the 
specific operation
+                * @param state_two The second "state" of the file or directory
+                * @param incversion Boolean True/False.  Increment the version 
for the file?  Note that this is
+                *               *    handled automatically for the 
VFS_OPERATION defines.
+                *               *    i.e. VFS_OPERATION_EDITED would increment 
the version, VFS_OPERATION_COPIED
+                *               *    would not
+                * @return Boolean True/False
+                */
+               function add_journal($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'             => 
array(RELATIVE_CURRENT),
+                               'state_one'             => false,
+                               'state_two'             => false,
+                               'incversion'    => true
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $account_id = 
$GLOBALS['phpgw_info']['user']['account_id'];
+
+                       $p = $this->path_parts(array('string' => 
$data['string'], 'relatives' => array($data['relatives'][0])));
+
+                       /* We check that they have some sort of access to the 
file other than read */
+                       if(!$this->acl_check(array('string' => 
$p->fake_full_path, 'relatives' => array($p->mask), 'operation' => 
PHPGW_ACL_ADD)) &&
+                               !$this->acl_check(array('string' => 
$p->fake_full_path, 'relatives' => array($p->mask), 'operation' => 
PHPGW_ACL_EDIT)) &&
+                               !$this->acl_check(array('string' => 
$p->fake_full_path, 'relatives' => array($p->mask), 'operation' => 
PHPGW_ACL_DELETE)))
+                       {
+                               return false;
+                       }
+
+                       if(!$this->file_exists(array('string' => 
$p->fake_full_path, 'relatives' => array($p->mask))))
+                       {
+                               return false;
+                       }
+
+                       $ls_array = $this->ls(array(
+                                       'string'                => 
$p->fake_full_path,
+                                       'relatives'             => 
array($p->mask),
+                                       'checksubdirs'  => false,
+                                       'mime_type'             => false,
+                                       'nofiles'               => true
+                               )
+                       );
+                       $file_array = $ls_array[0];
+
+                       $sql = 'INSERT INTO phpgw_vfs(';
+                       $sql2 = ' VALUES(';
+                       $morethanone = false;
+                       $modified = false;
+
+                       for($i = 0; list($attribute, $value) = 
each($file_array); $i++)
+                       {
+                               if($attribute == 'file_id' || $attribute == 
'content')
+                               {
+                                       continue;
+                               }
+
+                               if($attribute == 'owner_id')
+                               {
+                                       $value = $account_id;
+                               }
+
+                               if($attribute == 'created')
+                               {
+                                       $value = $this->now;
+                               }
+
+                               if($attribute == 'modified' && !$modified)
+                               {
+                                       unset($value);
+                               }
+
+                               if($attribute == 'mime_type')
+                               {
+                                       $value = 'journal';
+                               }
+
+                               if($attribute == 'comment')
+                               {
+                                       switch($data['operation'])
+                                       {
+                                               case VFS_OPERATION_CREATED:
+                                                       $value = 'Created';
+                                                       $data['incversion'] = 
true;
+                                                       break;
+                                               case VFS_OPERATION_EDITED:
+                                                       $value = 'Edited';
+                                                       $data['incversion'] = 
true;
+                                                       break;
+                                               case 
VFS_OPERATION_EDITED_COMMENT:
+                                                       $value = 'Edited 
comment';
+                                                       $data['incversion'] = 
false;
+                                                       break;
+                                               case VFS_OPERATION_COPIED:
+                                                       if(!$data['state_one'])
+                                                       {
+                                                               
$data['state_one'] = $p->fake_full_path;
+                                                       }
+                                                       if(!$data['state_two'])
+                                                       {
+                                                               return false;
+                                                       }
+                                                       $value = "Copied 
{$data['state_one']} to {$data['state_two']}";
+                                                       $data['incversion'] = 
false;
+                                                       break;
+                                               case VFS_OPERATION_MOVED:
+                                                       if(!$data['state_one'])
+                                                       {
+                                                               
$data['state_one'] = $p->fake_full_path;
+                                                       }
+                                                       if(!$data['state_two'])
+                                                       {
+                                                               return false;
+                                                       }
+                                                       $value = "Moved 
{$data['state_one']} to {$data['state_two']}";
+                                                       $data['incversion'] = 
false;
+                                                       break;
+                                               case VFS_OPERATION_DELETED:
+                                                       $value = 'Deleted';
+                                                       $data['incversion'] = 
false;
+                                                       break;
+                                               default:
+                                                       $value = 
$data['operation'];
+                                                       break;
+                                       }
+                               }
+
+                               /*
+                                  Let's increment the version for the file 
itself.  We keep the current
+                                  version when making the journal entry, 
because that was the version that
+                                  was operated on.  The maximum numbers for 
each part in the version string:
+                                  none.99.9.9
+                               */
+                               if($attribute == 'version' && 
$data['incversion'])
+                               {
+                                       $version_parts = explode(".", $value);
+                                       $newnumofparts = $numofparts = 
count($version_parts);
+
+                                       if($version_parts[3] >= 9)
+                                       {
+                                               $version_parts[3] = 0;
+                                               $version_parts[2]++;
+                                               $version_parts_3_update = 1;
+                                       }
+                                       else if(isset($version_parts[3]))
+                                       {
+                                               $version_parts[3]++;
+                                       }
+
+                                       if($version_parts[2] >= 9 && 
$version_parts[3] == 0 && $version_parts_3_update)
+                                       {
+                                               $version_parts[2] = 0;
+                                               $version_parts[1]++;
+                                       }
+
+                                       if($version_parts[1] > 99)
+                                       {
+                                               $version_parts[1] = 0;
+                                               $version_parts[0]++;
+                                       }
+                                       $newversion = '';
+                                       for($j = 0; $j < $newnumofparts; $j++)
+                                       {
+                                               if(!isset($version_parts[$j]))
+                                               {
+                                                       break;
+                                               }
+
+                                               if($j)
+                                               {
+                                                       $newversion .= '.';
+                                               }
+
+                                               $newversion .= 
$version_parts[$j];
+                                       }
+
+                                       $this->set_attributes(array(
+                                                       'string'                
=> $p->fake_full_path,
+                                                       'relatives'             
=> array($p->mask),
+                                                       'attributes'    => 
array(
+                                                                               
'version' => $newversion
+                                                                       )
+                                               )
+                                       );
+                               }
+                               if(isset($value) && !empty($value))
+                               {
+                                       if($morethanone)
+                                       {
+                                               $sql .= ', ';
+                                               $sql2 .= ', ';
+                                       }
+                                       else
+                                       {
+                                               $morethanone = true;
+                                       }
+                                       $sql .= "$attribute";
+                                       $sql2 .= "'" . 
$this->clean_string(array('string' => $value)) . "'";
+                               }
+                       }
+                       unset($morethanone);
+                       $sql .= ')';
+                       $sql2 .= ')';
+
+                       $sql .= $sql2;
+
+                       /*
+                          These are some special situations where we need to 
flush the journal entries
+                          or move the 'journal' entries to 'journal-deleted'.  
Kind of hackish, but they
+                          provide a consistent feel to the system
+                       */
+                       $flush_path = '';
+                       if($data['operation'] == VFS_OPERATION_CREATED)
+                       {
+                               $flush_path = $p->fake_full_path;
+                               $deleteall = true;
+                       }
+
+                       if($data['operation'] == VFS_OPERATION_COPIED || 
$data['operation'] == VFS_OPERATION_MOVED)
+                       {
+                               $flush_path = $data['state_two'];
+                               $deleteall = false;
+                       }
+
+                       if($flush_path)
+                       {
+                               $flush_path_parts = $this->path_parts(array(
+                                               'string'        => $flush_path,
+                                               'relatives'     => 
array(RELATIVE_NONE)
+                                       )
+                               );
+
+                               $this->flush_journal(array(
+                                               'string'        => 
$flush_path_parts->fake_full_path,
+                                               'relatives'     => 
array($flush_path_parts->mask),
+                                               'deleteall'     => $deleteall
+                                       )
+                               );
+                       }
+
+                       if($data['operation'] == VFS_OPERATION_COPIED)
+                       {
+                               /*
+                                  We copy it going the other way as well, so 
both files show the operation.
+                                  The code is a bad hack to prevent recursion. 
 Ideally it would use VFS_OPERATION_COPIED
+                               */
+                               $this->add_journal(array(
+                                               'string'        => 
$data['state_two'],
+                                               'relatives'     => 
array(RELATIVE_NONE),
+                                               'operation'     => "Copied 
{$data['state_one']} to {$data['state_two']}",
+                                               'state_one'     => null,
+                                               'state_two'     => null,
+                                               'incversion'    => false
+                                       )
+                               );
+                       }
+
+                       if($data['operation'] == VFS_OPERATION_MOVED)
+                       {
+                               $state_one_path_parts = $this->path_parts(array(
+                                               'string'        => 
$data['state_one'],
+                                               'relatives'     => 
array(RELATIVE_NONE)
+                                       )
+                               );
+
+                               $query = $GLOBALS['phpgw']->db->query("UPDATE 
phpgw_vfs SET mime_type='journal-deleted'"
+                                . " WHERE 
directory='{$state_one_path_parts->fake_leading_dirs_clean}'"
+                                . " AND 
name='{$state_one_path_parts->fake_name_clean}' AND mime_type='journal'");
+
+                               /*
+                                  We create the file in addition to logging 
the MOVED operation.  This is an
+                                  advantage because we can now search for 
'Create' to see when a file was created
+                               */
+                               $this->add_journal(array(
+                                               'string'        => 
$data['state_two'],
+                                               'relatives'     => 
array(RELATIVE_NONE),
+                                               'operation'     => 
VFS_OPERATION_CREATED
+                                       )
+                               );
+                       }
+
+                       /* This is the SQL query we made for THIS request, 
remember that one? */
+                       $query = $GLOBALS['phpgw']->db->query($sql, __LINE__, 
__FILE__);
+
+                       /*
+                          If we were to add an option of whether to keep 
journal entries for deleted files
+                          or not, it would go in the if here
+                       */
+                       if($data['operation'] == VFS_OPERATION_DELETED)
+                       {
+                               $query = $GLOBALS['phpgw']->db->query("UPDATE 
phpgw_vfs SET mime_type='journal-deleted'"
+                               . " WHERE 
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}' AND 
mime_type='journal'");
+                       }
+
+                       return true;
+               }
+
+               /**
+                * Flush journal entries for $string.  Used before adding 
$string
+               *
+                * flush_journal() is an internal function and should be called 
from add_journal() only
+                * @param string File/directory to flush journal entries of
+                * @param relatives Realtivity array
+                * @param deleteall Delete all types of journal entries, 
including the active Create entry.
+                *               *   Normally you only want to delete the 
Create entry when replacing the file
+                *               *   Note that this option does not effect 
$deleteonly
+                * @param deletedonly Only flush 'journal-deleted' 
entries(created when $string was deleted)
+                * @return Boolean True/False
+                */
+               function flush_journal($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'             => 
array(RELATIVE_CURRENT),
+                               'deleteall'             => false,
+                               'deletedonly'   => false
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       $sql = "DELETE FROM phpgw_vfs WHERE 
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'";
+
+                       if(!$data['deleteall'])
+                       {
+                               $sql .= " AND(mime_type != 'journal' AND 
comment != 'Created')";
+                       }
+
+                       $sql .= "  AND(mime_type='journal-deleted'";
+
+                       if(!$data['deletedonly'])
+                       {
+                               $sql .= " OR mime_type='journal'";
+                       }
+
+                       $sql .= ")";
+
+                       $query = $GLOBALS['phpgw']->db->query($sql, __LINE__, 
__FILE__);
+
+                       if($query)
+                       {
+                               return true;
+                       }
+                       else
+                       {
+                               return false;
+                       }
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function get_journal($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                               (
+                                       'relatives'     => 
array(RELATIVE_CURRENT),
+                                       'type'  => false
+                               );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       if(!$this->acl_check(array(
+                                       'string' => $p->fake_full_path,
+                                       'relatives' => array($p->mask)
+                               )))
+                       {
+                               return false;
+                       }
+
+                       $sql = "SELECT * FROM phpgw_vfs WHERE 
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'";
+
+                       if($data['type'] == 1)
+                       {
+                               $sql .= " AND mime_type='journal'";
+                       }
+                       elseif($data['type'] == 2)
+                       {
+                               $sql .= " AND mime_type='journal-deleted'";
+                       }
+                       else
+                       {
+                               $sql .= " AND(mime_type='journal' OR 
mime_type='journal-deleted')";
+                       }
+
+                       $query = $GLOBALS['phpgw']->db->query($sql, __LINE__, 
__FILE__);
+
+                       while($GLOBALS['phpgw']->db->next_record())
+                       {
+                               $rarray[] = $this->Record();
+                       }
+
+                       return $rarray;
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function acl_check($data)
+               {
+                       //echo 'checking vfs_sql::acl_check(' . print_r($data, 
true) . '</pre>';
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                               (
+                                       'relatives'     => 
array(RELATIVE_CURRENT),
+                                       'operation'     => PHPGW_ACL_READ,
+                                       'must_exist'    => false
+                               );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       /* Accommodate special situations */
+                       if($this->override_acl || $data['relatives'][0] == 
RELATIVE_USER_APP)
+                       {
+                               return true;
+                       }
+
+                       if(!isset($data['owner_id']) || !$data['owner_id'])
+                       {
+                               $p = $this->path_parts(array(
+                                               'string'        => 
$data['string'],
+                                               'relatives'     => 
array($data['relatives'][0])
+                                       )
+                               );
+
+                               /* Temporary, until we get symlink type files 
set up */
+                               if($p->outside)
+                               {
+                                       return true;
+                               }
+
+                               /* Read access is always allowed here, but 
nothing else is */
+                               if($data['string'] == '/' || $data['string'] == 
$this->fakebase)
+                               {
+                                       if($data['operation'] == PHPGW_ACL_READ)
+                                       {
+                                               return true;
+                                       }
+                                       else
+                                       {
+                                               return false;
+                                       }
+                               }
+
+                               /* If the file doesn't exist, we get ownership 
from the parent directory */
+                               if(!$this->file_exists(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask)
+                                       ))
+                               )
+                               {
+                                       if($data['must_exist'])
+                                       {
+                                               return false;
+                                       }
+
+                                       $data['string'] = $p->fake_leading_dirs;
+                                       $p2 = $this->path_parts(array(
+                                                       'string'        => 
$data['string'],
+                                                       'relatives'     => 
array($p->mask)
+                                               )
+                                       );
+
+                                       if(!$this->file_exists(array(
+                                                       'string'        => 
$data['string'],
+                                                       'relatives'     => 
array($p->mask)
+                                               ))
+                                       )
+                                       {
+                                               return false;
+                                       }
+                               }
+                               else
+                               {
+                                       $p2 = $p;
+                               }
+
+                               /*
+                                  We don't use ls() to get owner_id as we 
normally would,
+                                  because ls() calls acl_check(), which would 
create an infinite loop
+                               */
+                               $query = $GLOBALS['phpgw']->db->query("SELECT 
owner_id FROM phpgw_vfs WHERE directory='{$p2->fake_leading_dirs_clean}'"
+                               . " AND name='{$p2->fake_name_clean}'" . 
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+                               $GLOBALS['phpgw']->db->next_record();
+
+                               $record         = $this->Record();
+                               $owner_id       = $record['owner_id'];
+                       }
+                       else
+                       {
+                               $owner_id = $data['owner_id'];
+                       }
+
+                       /* This is correct.  The ACL currently doesn't handle 
undefined values correctly */
+                       if(!$owner_id)
+                       {
+                               $owner_id = 0;
+                       }
+
+                       $user_id = $GLOBALS['phpgw_info']['user']['account_id'];
+
+                       /* They always have access to their own files */
+                       if($owner_id == $user_id)
+                       {
+                               return true;
+                       }
+
+                       /* Check if they're in the group */
+                       $memberships = 
$GLOBALS['phpgw']->accounts->membership($user_id);
+
+                       if(is_array($memberships))
+                       {
+                               reset($memberships);
+                               while(list($num, $group_array) = 
each($memberships))
+                               {
+                                       if($owner_id == $group_array->id)
+                                       {
+                                               $group_ok = 1;
+                                               break;
+                                       }
+                               }
+                       }
+
+throw new Exception('vfs::acl_check() - not implemented correctly');
+                       $acl = CreateObject('phpgwapi.acl', $owner_id);
+                       $acl->set_account_id($owner_id, true);
+
+                       $rights = $acl->get_rights($user_id);
+
+                       /* Add privileges from the groups this user belongs to 
*/
+                       if(is_array($memberships))
+                       {
+                               reset($memberships);
+                               while(list($num, $group_array) = 
each($memberships))
+                               {
+                                       $rights |= 
$acl->get_rights($group_array->id);
+                               }
+                       }
+
+                       if($rights & $data['operation'])
+                       {
+                               return true;
+                       }
+                       elseif(!$rights && $group_ok)
+                       {
+                               if($this->acl_default == 'grant')
+                               {
+                                       return true;
+                               }
+                               else
+                               {
+                                       return false;
+                               }
+                       }
+                       else
+                       {
+                               return false;
+                       }
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function read($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'     => array(RELATIVE_CURRENT)
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       if(!$this->acl_check(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask),
+                                       'operation'     => PHPGW_ACL_READ
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       if($this->file_actions || $p->outside)
+                       {
+                               $contents = $this->fileoperation->read($p);
+                       }
+                       else
+                       {
+                               $ls_array = $this->ls(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask)
+                                       )
+                               );
+
+                               $contents = $ls_array[0]['content'];
+                       }
+
+                       return $contents;
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function write($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'     => array(RELATIVE_CURRENT),
+                               'content'       => ''
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       if($this->file_exists(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask)
+                               ))
+                       )
+                       {
+                               $acl_operation = PHPGW_ACL_EDIT;
+                               $journal_operation = VFS_OPERATION_EDITED;
+                       }
+                       else
+                       {
+                               $acl_operation = PHPGW_ACL_ADD;
+                       }
+
+                       if(!$this->acl_check(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask),
+                                       'operation'     => $acl_operation
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       umask(000);
+
+                       /*
+                          If 'string' doesn't exist, touch() creates both the 
file and the database entry
+                          If 'string' does exist, touch() sets the 
modification time and modified by
+                       */
+                       $this->touch(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask)
+                               )
+                       );
+
+                       if($this->file_actions)
+                       {
+                               $write_ok = $this->fileoperation->write($p, 
$data['content']);
+                       }
+
+                       if($write_ok || !$this->file_actions)
+                       {
+                               if($this->file_actions)
+                               {
+                                       $set_attributes_array = array(
+                                       //      'size'  => 
$this->fileoperation->filesize($p)
+                                               'size'  => 
strlen($data['content']),
+                                       );
+                               }
+                               else
+                               {
+                                       $set_attributes_array = array(
+                                               'size'  => 
strlen($data['content']),
+                                               'content'       => 
$data['content']
+                                       );
+                               }
+
+                               $this->set_attributes(array
+                                       (
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask),
+                                               'attributes'    => 
$set_attributes_array
+                                       )
+                               );
+
+                               if($journal_operation)
+                               {
+                                       $this->add_journal(array(
+                                                       'string'        => 
$p->fake_full_path,
+                                                       'relatives'     => 
array($p->mask),
+                                                       'operation'     => 
$journal_operation
+                                               )
+                                       );
+                               }
+
+                               return true;
+                       }
+                       else
+                       {
+                               return false;
+                       }
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function touch($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'     => array(RELATIVE_CURRENT)
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $account_id = 
$GLOBALS['phpgw_info']['user']['account_id'];
+                       $currentapp = 
$GLOBALS['phpgw_info']['flags']['currentapp'];
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       umask(000);
+
+                       if($this->file_actions)
+                       {
+                               /*
+                                  PHP's touch function will automatically 
decide whether to
+                                  create the file or set the modification time
+                               */
+
+                               $rr = $this->fileoperation->touch($p);
+
+                               if($p->outside)
+                               {
+                                       return $rr;
+                               }
+                       }
+
+                       /* We, however, have to decide this ourselves */
+                       if($this->file_exists(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask)
+                               ))
+                       )
+                       {
+                               if(!$this->acl_check(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask),
+                                               'operation'     => 
PHPGW_ACL_EDIT
+                                       )))
+                               {
+                                       return false;
+                               }
+
+                               $vr = $this->set_attributes(array(
+                                               'string'                => 
$p->fake_full_path,
+                                               'relatives'             => 
array($p->mask),
+                                               'attributes'    => array(
+                                                                       
'modifiedby_id' => $account_id,
+                                                                       
'modified'              => $this->now
+                                                               )
+                                               )
+                                       );
+                       }
+                       else
+                       {
+                               if(!$this->acl_check(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask),
+                                               'operation'     => PHPGW_ACL_ADD
+                                       ))
+                               )
+                               {
+                                       return false;
+                               }
+
+                               $query = $GLOBALS['phpgw']->db->query("INSERT 
INTO phpgw_vfs (owner_id, directory, name)"
+                                . " 
VALUES({$this->working_id},'{$p->fake_leading_dirs_clean}', 
'{$p->fake_name_clean}')", __LINE__, __FILE__);
+
+                               $this->set_attributes(array(
+                                       'string'                => 
$p->fake_full_path,
+                                       'relatives'             => 
array($p->mask),
+                                       'attributes'    => array(
+                                                               'createdby_id'  
=> $account_id,
+                                                               'created'       
        => $this->now,
+                                                               'size'          
        => 0,
+                                                               'deleteable'    
=> 'Y',
+                                                               'app'           
        => $currentapp
+                                                       )
+                                       )
+                               );
+                               $this->correct_attributes(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask)
+                                       )
+                               );
+
+                               $this->add_journal(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask),
+                                               'operation'     => 
VFS_OPERATION_CREATED
+                                       )
+                               );
+                       }
+
+                       if($rr || $vr || $query)
+                       {
+                               return true;
+                       }
+                       else
+                       {
+                               return false;
+                       }
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function cp($data)
+               {
+                       if(!$data['from'])
+                       {
+                               throw new Exception('nothing to copy from');
+                       }
+
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'     => array(RELATIVE_CURRENT, 
RELATIVE_CURRENT)
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $account_id = 
$GLOBALS['phpgw_info']['user']['account_id'];
+
+                       $f = $this->path_parts(array(
+                                       'string'        => $data['from'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       $t = $this->path_parts(array(
+                                       'string'        => $data['to'],
+                                       'relatives'     => 
array($data['relatives'][1])
+                               )
+                       );
+
+                       if(!$this->fileoperation->check_target_directory($t))
+                       {
+                               $GLOBALS['phpgw']->log->error(array(
+                                       'text' => 'vfs::cp() : missing target 
directory %1',
+                                       'p1'   => $t->real_leading_dirs,
+                                       'p2'     => '',
+                                       'line' => __LINE__,
+                                       'file' => __FILE__
+                               ));
+
+                               return false;
+                       }
+
+                       if(!$this->acl_check(array(
+                                       'string'        => $f->fake_full_path,
+                                       'relatives'     => array($f->mask),
+                                       'operation'     => PHPGW_ACL_READ
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       if($this->file_exists(array(
+                                       'string'        => $t->fake_full_path,
+                                       'relatives'     => array($t->mask)
+                               ))
+                       )
+                       {
+                               if(!$this->acl_check(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask),
+                                               'operation'     => 
PHPGW_ACL_EDIT
+                                       ))
+                               )
+                               {
+                                       return false;
+                               }
+                       }
+                       else
+                       {
+                               if(!$this->acl_check(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask),
+                                               'operation'     => PHPGW_ACL_ADD
+                                       ))
+                               )
+                               {
+                                       return false;
+                               }
+
+                       }
+
+                       umask(000);
+
+                       if($this->file_type(array(
+                                       'string'        => $f->fake_full_path,
+                                       'relatives'     => array($f->mask)
+                               )) != 'Directory'
+                       )
+                       {
+                               if($this->file_actions)
+                               {
+                                       if(!$this->fileoperation->copy($f, $t))
+                                       {
+                                               return false;
+                                       }
+
+                                       $size = 
$this->fileoperation->filesize($t);
+                               }
+                               else
+                               {
+                                       $content = $this->read(array(
+                                                       'string'        => 
$f->fake_full_path,
+                                                       'relatives'     => 
array($f->mask)
+                                               )
+                                       );
+
+                                       $size = strlen($content);
+                               }
+
+                               if($t->outside)
+                               {
+                                       return true;
+                               }
+
+                               $ls_array = $this->ls(array(
+                                               'string'        => 
$f->real_full_path, // Sigurd: seems to work better with real - old: 'string'   
     => $f->fake_full_path,
+                                               'relatives'     => 
array($f->mask),
+                                               'checksubdirs'  => false,
+                                               'mime_type'     => false,
+                                               'nofiles'       => true
+                                       )
+                               );
+                               $record = $ls_array[0];
+
+                               if($this->file_exists(array(
+                                               'string'        => $data['to'],
+                                               'relatives'     => 
array($data['relatives'][1])
+                                       ))
+                               )
+                               {
+                                       $query = 
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET 
owner_id='{$this->working_id}',"
+                                       . " 
directory='{$t->fake_leading_dirs_clean}',"
+                                       . " name='{$t->fake_name_clean}'"
+                                       . " WHERE 
owner_id='{$this->working_id}' AND directory='{$t->fake_leading_dirs_clean}'"
+                                       . " AND name='{$t->fake_name_clean}'" . 
$this->extra_sql(VFS_SQL_UPDATE), __LINE__, __FILE__);
+
+                                       $set_attributes_array = array
+                                       (
+                                               'createdby_id'  => $account_id,
+                                               'created'               => 
$this->now,
+                                               'size'                  => 
$size,
+                                               'mime_type'             => 
$record['mime_type'],
+                                               'deleteable'    => 
$record['deleteable'],
+                                               'comment'               => 
$record['comment'],
+                                               'app'                   => 
$record['app']
+                                       );
+
+                                       if(!$this->file_actions)
+                                       {
+                                               
$set_attributes_array['content'] = $content;
+                                       }
+
+                                       $this->set_attributes(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask),
+                                               'attributes'    => 
$set_attributes_array
+                                               )
+                                       );
+
+                                       $this->add_journal(array(
+                                                       'string'        => 
$t->fake_full_path,
+                                                       'relatives'     => 
array($t->mask),
+                                                       'operation'     => 
VFS_OPERATION_EDITED
+                                               )
+                                       );
+                               }
+                               else
+                               {
+                                       $this->touch(array(
+                                                       'string'        => 
$t->fake_full_path,
+                                                       'relatives'     => 
array($t->mask)
+                                               )
+                                       );
+
+                                       $set_attributes_array = array
+                                       (
+                                               'createdby_id'  => $account_id,
+                                               'created'               => 
$this->now,
+                                               'size'                  => 
$size,
+                                               'mime_type'             => 
$record['mime_type'],
+                                               'deleteable'    => 
$record['deleteable'],
+                                               'comment'               => 
$record['comment'],
+                                               'app'                   => 
$record['app']
+                                       );
+
+                                       if(!$this->file_actions)
+                                       {
+                                               
$set_attributes_array['content'] = $content;
+                                       }
+
+                                       $this->set_attributes(array(
+                                                       'string'        => 
$t->fake_full_path,
+                                                       'relatives'     => 
array($t->mask),
+                                                       'attributes'    => 
$set_attributes_array
+                                               )
+                                       );
+                               }
+                               $this->correct_attributes(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask)
+                                       )
+                               );
+                       }
+                       else    /* It's a directory */
+                       {
+                               /* First, make the initial directory */
+                               if($this->mkdir(array(
+                                               'string'        => $data['to'],
+                                               'relatives'     => 
array($data['relatives'][1])
+                                       )) === false
+                               )
+                               {
+                                       return false;
+                               }
+
+                               /* Next, we create all the directories below 
the initial directory */
+                               $ls = $this->ls(array(
+                                               'string'        => 
$f->fake_full_path,
+                                               'relatives'     => 
array($f->mask),
+                                               'checksubdirs'  => true,
+                                               'mime_type'     => 'Directory'
+                                       )
+                               );
+
+                               while(list($num, $entry) = each($ls))
+                               {
+                                       $newdir = 
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path, 
$entry['directory']);
+                                       if($this->mkdir(array(
+                                                       'string'        => 
"{$newdir}/{$entry['name']}",
+                                                       'relatives'     => 
array($t->mask)
+                                               )) === false
+                                       )
+                                       {
+                                               return false;
+                                       }
+                               }
+
+                               /* Lastly, we copy the files over */
+                               $ls = $this->ls(array(
+                                               'string'        => 
$f->fake_full_path,
+                                               'relatives'     => 
array($f->mask)
+                                       )
+                               );
+
+                               while(list($num, $entry) = each($ls))
+                               {
+                                       if($entry['mime_type'] == 'Directory')
+                                       {
+                                               continue;
+                                       }
+
+                                       $newdir = 
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path, 
$entry['directory']);
+                                       $this->cp(array(
+                                                       'from'  => 
"{$entry[directory]}/{$entry[name]}",
+                                                       'to'    => 
"{$newdir}/{$entry[name]}",
+                                                       'relatives'     => 
array($f->mask, $t->mask)
+                                               )
+                                       );
+                               }
+                       }
+
+                       if(!$f->outside)
+                       {
+                               $this->add_journal(array(
+                                               'string'        => 
$f->fake_full_path,
+                                               'relatives'     => 
array($f->mask),
+                                               'operation'     => 
VFS_OPERATION_COPIED,
+                                               'state_one'     => NULL,
+                                               'state_two'     => 
$t->fake_full_path
+                                       )
+                               );
+                       }
+
+                       return true;
+               }
+               /*
+                * Same as cp function, except an exception is thrown if there 
is a failure
+                * errors have also been expanded
+                */
+               function cp2($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'     => array(RELATIVE_CURRENT, 
RELATIVE_CURRENT)
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $account_id = 
$GLOBALS['phpgw_info']['user']['account_id'];
+
+                       $f = $this->path_parts(array(
+                                       'string'        => $data['from'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       $t = $this->path_parts(array(
+                                       'string'        => $data['to'],
+                                       'relatives'     => 
array($data['relatives'][1])
+                               )
+                       );
+
+                       if(!$this->acl_check(array(
+                                       'string'        => $f->fake_full_path,
+                                       'relatives'     => array($f->mask),
+                                       'operation'     => PHPGW_ACL_READ
+                               ))
+                       )
+                       {
+                               throw new Exception('ACL(READ) check failed!');
+                       }
+
+                       if($this->file_exists(array(
+                                       'string'        => $t->fake_full_path,
+                                       'relatives'     => array($t->mask)
+                               ))
+                       )
+                       {
+                               if(!$this->acl_check(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask),
+                                               'operation'     => 
PHPGW_ACL_EDIT
+                                       ))
+                               )
+                               {
+                                       throw new Exception('ACL(EDIT) check 
failed!');
+                               }
+                       }
+                       else
+                       {
+                               if(!$this->acl_check(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask),
+                                               'operation'     => PHPGW_ACL_ADD
+                                       ))
+                               )
+                               {
+                                       throw new Exception('ACL(ADD) check 
failed!');
+                               }
+
+                       }
+
+                       umask(000);
+
+                       if($this->file_type(array(
+                                       'string'        => $f->fake_full_path,
+                                       'relatives'     => array($f->mask)
+                               )) != 'Directory'
+                       )
+                       {
+                               if($this->file_actions)
+                               {
+                                       if(!$this->fileoperation->copy($f, $t))
+                                       {
+                                               $error = "Copy failed!\n";
+                                               $error = $error. 
"f->real_full_path: $f->real_full_path \n";
+                                               $error = $error. 
"t->real_full_path: $t->real_full_path \n";
+                                               throw new Exception($error);
+                                       }
+                                       $size = 
$this->fileoperation->filesize($t);
+                               }
+                               else
+                               {
+                                       $content = $this->read(array(
+                                                       'string'        => 
$f->fake_full_path,
+                                                       'relatives'     => 
array($f->mask)
+                                               )
+                                       );
+
+                                       $size = strlen($content);
+                               }
+
+                               if($t->outside)
+                               {
+                                       return true;
+                               }
+
+                               $ls_array = $this->ls(array(
+                                               'string'                => 
$f->real_full_path, // Sigurd: seems to work better with real - old: 'string'   
     => $f->fake_full_path,
+                                               'relatives'             => 
array($f->mask),
+                                               'checksubdirs'  => false,
+                                               'mime_type'             => 
false,
+                                               'nofiles'               => true
+                                       )
+                               );
+                               $record = $ls_array[0];
+
+                               if($this->file_exists(array(
+                                               'string'        => $data['to'],
+                                               'relatives'     => 
array($data['relatives'][1])
+                                       ))
+                               )
+                               {
+                                       $query = 
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET 
owner_id='{$this->working_id}',"
+                                       . " 
directory='{$t->fake_leading_dirs_clean}',"
+                                       . " name='{$t->fake_name_clean}'"
+                                       . " WHERE 
owner_id='{$this->working_id}' AND directory='{$t->fake_leading_dirs_clean}'"
+                                       . " AND name='$t->fake_name_clean'" . 
$this->extra_sql(VFS_SQL_UPDATE), __LINE__, __FILE__);
+
+                                       $set_attributes_array = array
+                                       (
+                                               'createdby_id'          => 
$account_id,
+                                               'created'                       
=> $this->now,
+                                               'size'                          
=> $size,
+                                               'mime_type'                     
=> $record['mime_type'],
+                                               'deleteable'            => 
$record['deleteable'],
+                                               'comment'                       
=> $record['comment'],
+                                               'app'                           
=> $record['app']
+                                       );
+
+                                       if(!$this->file_actions)
+                                       {
+                                               
$set_attributes_array['content'] = $content;
+                                       }
+
+                                       $this->set_attributes(array(
+                                               'string'                => 
$t->fake_full_path,
+                                               'relatives'             => 
array($t->mask),
+                                               'attributes'    => 
$set_attributes_array
+                                               )
+                                       );
+
+                                       $this->add_journal(array(
+                                                       'string'        => 
$t->fake_full_path,
+                                                       'relatives'     => 
array($t->mask),
+                                                       'operation'     => 
VFS_OPERATION_EDITED
+                                               )
+                                       );
+                               }
+                               else
+                               {
+                                       $this->touch(array(
+                                                       'string'        => 
$t->fake_full_path,
+                                                       'relatives'     => 
array($t->mask)
+                                               )
+                                       );
+
+                                       $set_attributes_array = array
+                                       (
+                                               'createdby_id'          => 
$account_id,
+                                               'created'                       
=> $this->now,
+                                               'size'                          
=> $size,
+                                               'mime_type'                     
=> $record['mime_type'],
+                                               'deleteable'            => 
$record['deleteable'],
+                                               'comment'                       
=> $record['comment'],
+                                               'app'                           
=> $record['app']
+                                       );
+
+                                       if(!$this->file_actions)
+                                       {
+                                               
$set_attributes_array['content'] = $content;
+                                       }
+
+                                       $this->set_attributes(array(
+                                                       'string'                
=> $t->fake_full_path,
+                                                       'relatives'             
=> array($t->mask),
+                                                       'attributes'    => 
$set_attributes_array
+                                               )
+                                       );
+                               }
+                               $this->correct_attributes(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask)
+                                       )
+                               );
+                       }
+                       else    /* It's a directory */
+                       {
+                               /* First, make the initial directory */
+                               if($this->mkdir(array(
+                                               'string'        => $data['to'],
+                                               'relatives'     => 
array($data['relatives'][1])
+                                       )) === false
+                               )
+                               {
+                                       throw new Exception('Error, it is a 
directory');
+                               }
+
+                               /* Next, we create all the directories below 
the initial directory */
+                               $ls = $this->ls(array(
+                                               'string'                => 
$f->fake_full_path,
+                                               'relatives'             => 
array($f->mask),
+                                               'checksubdirs'  => true,
+                                               'mime_type'             => 
'Directory'
+                                       )
+                               );
+
+                               while(list($num, $entry) = each($ls))
+                               {
+                                       $newdir = 
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path, 
$entry['directory']);
+                                       if($this->mkdir(array(
+                                                       'string'        => 
"{$newdir}/{$entry['name']}",
+                                                       'relatives'     => 
array($t->mask)
+                                               )) === false
+                                       )
+                                       {
+                                               throw new Exception('While loop 
error!');
+                                       }
+                               }
+
+                               /* Lastly, we copy the files over */
+                               $ls = $this->ls(array(
+                                               'string'        => 
$f->fake_full_path,
+                                               'relatives'     => 
array($f->mask)
+                                       )
+                               );
+
+                               while(list($num, $entry) = each($ls))
+                               {
+                                       if($entry['mime_type'] == 'Directory')
+                                       {
+                                               continue;
+                                       }
+
+                                       $newdir = 
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path, 
$entry['directory']);
+                                       $this->cp(array(
+                                                       'from'          => 
"{$entry[directory]}/{$entry[name]}",
+                                                       'to'            => 
"{$newdir}/{$entry[name]}",
+                                                       'relatives'     => 
array($f->mask, $t->mask)
+                                               )
+                                       );
+                               }
+                       }
+
+                       if(!$f->outside)
+                       {
+                               $this->add_journal(array(
+                                               'string'        => 
$f->fake_full_path,
+                                               'relatives'     => 
array($f->mask),
+                                               'operation'     => 
VFS_OPERATION_COPIED,
+                                               'state_one'     => NULL,
+                                               'state_two'     => 
$t->fake_full_path
+                                       )
+                               );
+                       }
+
+                       return true;
+               }
+               /*
+                * See vfs_shared
+                */
+               function mv($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'     => array(RELATIVE_CURRENT, 
RELATIVE_CURRENT)
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $account_id = 
$GLOBALS['phpgw_info']['user']['account_id'];
+                       $f = $this->path_parts(array(
+                                       'string'        => $data['from'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       $t = $this->path_parts(array(
+                                       'string'        => $data['to'],
+                                       'relatives'     => 
array($data['relatives'][1])
+                               )
+                       );
+                       if(!$this->acl_check(array(
+                                       'string'        => $f->fake_full_path,
+                                       'relatives'     => array($f->mask),
+                                       'operation'     => PHPGW_ACL_READ
+                               ))
+                               || !$this->acl_check(array(
+                                       'string'        => $f->fake_full_path,
+                                       'relatives'     => array($f->mask),
+                                       'operation'     => PHPGW_ACL_DELETE
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       if(!$this->acl_check(array(
+                                       'string'        => $t->fake_full_path,
+                                       'relatives'     => array($t->mask),
+                                       'operation'     => PHPGW_ACL_ADD
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       if($this->file_exists(array(
+                                       'string'        => $t->fake_full_path,
+                                       'relatives'     => array($t->mask)
+                               ))
+                       )
+                       {
+                               if(!$this->acl_check(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask),
+                                               'operation'     => 
PHPGW_ACL_EDIT
+                                       ))
+                               )
+                               {
+                                       return false;
+                               }
+                       }
+
+                       umask(000);
+
+                       /* We can't move directories into themselves */
+                       if(($this->file_type(array(
+                                       'string'        => $f->fake_full_path,
+                                       'relatives'     => array($f->mask)
+                               ) == 'Directory'))
+                               && preg_match("/^{$f->fake_full_path}/", 
$t->fake_full_path)
+                       )
+                       {
+                               if(($t->fake_full_path == $f->fake_full_path) 
|| substr($t->fake_full_path, strlen($f->fake_full_path), 1) == '/')
+                               {
+                                       return false;
+                               }
+                       }
+                       if($this->file_exists(array(
+                                       'string'        => $f->fake_full_path,
+                                       'relatives'     => array($f->mask)
+                               ))
+                       )
+                       {
+                               /* We get the listing now, because it will 
change after we update the database */
+                               $ls = $this->ls(array(
+                                               'string'        => 
$f->fake_full_path,
+                                               'relatives'     => 
array($f->mask)
+                                       )
+                               );
+
+                               if($this->file_exists(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask)
+                                       ))
+                               )
+                               {
+                                       $this->rm(array(
+                                                       'string'        => 
$t->fake_full_path,
+                                                       'relatives'     => 
array($t->mask)
+                                               )
+                                       );
+                               }
+
+                               /*
+                                  We add the journal entry now, before we 
delete.  This way the mime_type
+                                  field will be updated to 'journal-deleted' 
when the file is actually deleted
+                               */
+                               if(!$f->outside)
+                               {
+                                       $this->add_journal(array(
+                                                       'string'        => 
$f->fake_full_path,
+                                                       'relatives'     => 
array($f->mask),
+                                                       'operation'     => 
VFS_OPERATION_MOVED,
+                                                       'state_one'     => 
$f->fake_full_path,
+                                                       'state_two'     => 
$t->fake_full_path
+                                               )
+                                       );
+                               }
+
+                               /*
+                                  If the from file is outside, it won't have a 
database entry,
+                                  so we have to touch it and find the size
+                               */
+                               if($f->outside)
+                               {
+                                       $size = 
$this->fileoperation->filesize($f);
+                                       if( $size === false )
+                                       {
+                                               _debug_array($f);
+                                               $size = 1;
+                                       }
+                                       $this->touch(array(
+                                                       'string'        => 
$t->fake_full_path,
+                                                       'relatives'     => 
array($t->mask)
+                                               )
+                                       );
+                                       $query = 
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET size={$size}"
+                                       . " WHERE 
directory='{$t->fake_leading_dirs_clean}'"
+                                       . " AND name='{$t->fake_name_clean}'" . 
$this->extra_sql(array('query_type' => VFS_SQL_UPDATE)), __LINE__, __FILE__);
+                               }
+                               elseif(!$t->outside)
+                               {
+                                       $query = 
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET 
name='{$t->fake_name_clean}', directory='{$t->fake_leading_dirs_clean}'"
+                                       . " WHERE 
directory='{$f->fake_leading_dirs_clean}'"
+                                       . " AND name='{$f->fake_name_clean}'" . 
$this->extra_sql(array('query_type' => VFS_SQL_UPDATE)), __LINE__, __FILE__);
+                               }
+
+                               $this->set_attributes(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask),
+                                               'attributes'    => array(
+                                                                       
'modifiedby_id' => $account_id,
+                                                                       
'modified' => $this->now
+                                                               )
+                                       )
+                               );
+
+                               $this->correct_attributes(array(
+                                               'string'        => 
$t->fake_full_path,
+                                               'relatives'     => 
array($t->mask)
+                                       )
+                               );
+
+                               if($this->file_actions)
+                               {
+                                       $rr = $this->fileoperation->rename($f, 
$t);
+                               }
+
+                               /*
+                                  This removes the original entry from the 
database
+                                  The actual file is already deleted because 
of the rename() above
+                               */
+                               if($t->outside)
+                               {
+                                       $this->rm(array(
+                                                       'string'        => 
$f->fake_full_path,
+                                                       'relatives'     => 
$f->mask
+                                               )
+                                       );
+                               }
+                       }
+                       else
+                       {
+                               return false;
+                       }
+
+                       if($this->file_type(array(
+                                       'string'        => $t->fake_full_path,
+                                       'relatives'     => array($t->mask)
+                               )) == 'Directory'
+                       )
+                       {
+                               /* We got $ls from above, before we renamed the 
directory */
+                               while(list($num, $entry) = each($ls))
+                               {
+                                       $newdir = 
preg_replace("/^{$f->fake_full_path}/", $t->fake_full_path, 
$entry['directory']);
+                                       $newdir_clean = 
$this->clean_string(array('string' => $newdir));
+
+                                       $query = 
$GLOBALS['phpgw']->db->query("UPDATE phpgw_vfs SET directory='{$newdir_clean}'"
+                                       . " WHERE file_id='{$entry[file_id]}'" 
. $this->extra_sql(array('query_type' => VFS_SQL_UPDATE)), __LINE__, __FILE__);
+
+                                       $this->correct_attributes(array(
+                                                       'string'        => 
"{$newdir}/{$entry[name]}",
+                                                       'relatives'     => 
array($t->mask)
+                                               )
+                                       );
+                               }
+                       }
+
+                       $this->add_journal(array(
+                                       'string'        => $t->fake_full_path,
+                                       'relatives'     => array($t->mask),
+                                       'operation'     => VFS_OPERATION_MOVED,
+                                       'state_one'     => $f->fake_full_path,
+                                       'state_two'     => $t->fake_full_path
+                               )
+                       );
+
+                       return true;
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function rm($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'     => array(RELATIVE_CURRENT)
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       if(!$this->acl_check(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask),
+                                       'operation'     => PHPGW_ACL_DELETE
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       if(!$this->file_exists(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               ))
+                       )
+                       {
+                               if($this->file_actions)
+                               {
+                                       $rr = $this->fileoperation->unlink($p);
+                               }
+                               else
+                               {
+                                       $rr = true;
+                               }
+
+                               if($rr)
+                               {
+                                       return true;
+                               }
+                               else
+                               {
+                                       return false;
+                               }
+                       }
+
+                       if($this->file_type(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )) != 'Directory'
+                       )
+                       {
+                               $this->add_journal(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask),
+                                               'operation'     => 
VFS_OPERATION_DELETED
+                                       )
+                               );
+
+                               $query = $GLOBALS['phpgw']->db->query("DELETE 
FROM phpgw_vfs"
+                               . " WHERE 
directory='{$p->fake_leading_dirs_clean}'"
+                               . " AND name='{$p->fake_name_clean}'" . 
$this->extra_sql(array('query_type' => VFS_SQL_DELETE)), __LINE__, __FILE__);
+
+                               if($this->file_actions)
+                               {
+                                       $rr = $this->fileoperation->unlink($p);
+                               }
+                               else
+                               {
+                                       $rr = true;
+                               }
+
+                               if($query || $rr)
+                               {
+                                       return true;
+                               }
+                               else
+                               {
+                                       return false;
+                               }
+                       }
+                       else
+                       {
+                               $ls = $this->ls(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask)
+                                       )
+                               );
+
+                               /* First, we cycle through the entries and 
delete the files */
+                               while(list($num, $entry) = each($ls))
+                               {
+                                       if($entry['mime_type'] == 'Directory')
+                                       {
+                                               continue;
+                                       }
+
+                                       $this->rm(array(
+                                                       'string'        => 
"{$entry['directory']}/{$entry['name']}",
+                                                       'relatives'     => 
array($p->mask)
+                                               )
+                                       );
+                               }
+
+                               /* Now we cycle through again and delete the 
directories */
+                               reset($ls);
+                               while(list($num, $entry) = each($ls))
+                               {
+                                       if($entry['mime_type'] != 'Directory')
+                                       {
+                                               continue;
+                                       }
+
+                                       /* Only the best in confusing recursion 
*/
+                                       $this->rm(array(
+                                                       'string'        => 
"{$entry['directory']}/{$entry['name']}",
+                                                       'relatives'     => 
array($p->mask)
+                                               )
+                                       );
+                               }
+
+                               /* If the directory is linked, we delete the 
placeholder directory */
+                               $ls_array = $this->ls(array(
+                                               'string'                => 
$p->fake_full_path,
+                                               'relatives'             => 
array($p->mask),
+                                               'checksubdirs'  => false,
+                                               'mime_type'             => 
false,
+                                               'nofiles'               => true
+                                       )
+                               );
+                               $link_info = $ls_array[0];
+
+                               if($link_info['link_directory'] && 
$link_info['link_name'])
+                               {
+                                       $path = $this->path_parts(array(
+                                                       'string'        => 
"{$link_info['directory']}/{$link_info['name']}",
+                                                       'relatives'     => 
array($p->mask),
+                                                       'nolinks'       => true
+                                               )
+                                       );
+
+                                       if($this->file_actions)
+                                       {
+                                               
$this->fileoperation->rmdir($path);
+                                       }
+                               }
+
+                               /* Last, we delete the directory itself */
+                               $this->add_journal(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask),
+                                               'operaton'      => 
VFS_OPERATION_DELETED
+                                       )
+                               );
+
+                               $query = $GLOBALS['phpgw']->db->query("DELETE 
FROM phpgw_vfs"
+                               . " WHERE 
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" . 
$this->extra_sql(array('query_type' => VFS_SQL_DELETE)), __LINE__, __FILE__);
+
+                               if($this->file_actions)
+                               {
+                                       $this->fileoperation->rmdir($p);
+                               }
+
+                               return true;
+                       }
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function mkdir($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'     => array(RELATIVE_CURRENT)
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $account_id = 
$GLOBALS['phpgw_info']['user']['account_id'];
+                       $currentapp = 
$GLOBALS['phpgw_info']['flags']['currentapp'];
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       if(!$this->acl_check(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask),
+                                       'operation'     => PHPGW_ACL_ADD)
+                               )
+                       )
+                       {
+                               return false;
+                       }
+
+                       /* We don't allow /'s in dir names, of course */
+                       if(preg_match('/\//', $p->fake_name))
+                       {
+                               return false;
+                       }
+
+                       umask(000);
+
+                       if($this->file_actions)
+                       {
+                               
if(!$this->fileoperation->check_target_directory($p))
+                               {
+                                       $GLOBALS['phpgw']->log->error(array(
+                                               'text' => 'vfs::mkdir() : 
missing leading directory %1 when attempting to create %2',
+                                               'p1'   => $p->real_leading_dirs,
+                                               'p2'     => $p->real_full_path,
+                                               'line' => __LINE__,
+                                               'file' => __FILE__
+                                       ));
+
+                                       return false;
+                               }
+
+                               /* Auto create home */
+
+                               
$this->fileoperation->auto_create_home($this->basedir);
+
+                               if($this->fileoperation->file_exists($p))
+                               {
+                                       if(!$this->fileoperation->is_dir($p))
+                                       {
+                                               return false;
+                                       }
+                               }
+                               else if(!$this->fileoperation->mkdir($p))
+                               {
+                                       $GLOBALS['phpgw']->log->error(array(
+                                               'text' => 'vfs::mkdir() : 
failed to create directory %1',
+                                               'p1'   => $p->real_full_path,
+                                               'p2'     => '',
+                                               'line' => __LINE__,
+                                               'file' => __FILE__
+                                       ));
+
+                                       return false;
+                               }
+
+                       }
+
+                       if(!$this->file_exists(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask)
+                               ))
+                       )
+                       {
+                               $query = $GLOBALS['phpgw']->db->query("INSERT 
INTO phpgw_vfs(owner_id, name, directory)"
+                               . " VALUES({$this->working_id}, 
'{$p->fake_name_clean}', '{$p->fake_leading_dirs_clean}')", __LINE__, __FILE__);
+                               $this->set_attributes(array(
+                                       'string'                => 
$p->fake_full_path,
+                                       'relatives'             => 
array($p->mask),
+                                       'attributes'    => array(
+                                                               'createdby_id'  
=> $account_id,
+                                                               'size'          
        => 4096,
+                                                               'mime_type'     
        => 'Directory',
+                                                               'created'       
        => $this->now,
+                                                               'deleteable'    
=> 'Y',
+                                                               'app'           
        => $currentapp
+                                                       )
+                                       )
+                               );
+
+                               $this->correct_attributes(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask)
+                                       )
+                               );
+
+                               $this->add_journal(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask),
+                                               'operation'     => 
VFS_OPERATION_CREATED
+                                       )
+                               );
+                       }
+                       else
+                       {
+                               return false;
+                       }
+
+                       return true;
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function make_link($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                               (
+                                       'relatives'     => 
array(RELATIVE_CURRENT, RELATIVE_CURRENT)
+                               );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $account_id = 
$GLOBALS['phpgw_info']['user']['account_id'];
+                       $currentapp = 
$GLOBALS['phpgw_info']['flags']['currentapp'];
+
+                       $vp = $this->path_parts(array(
+                                       'string'        => $data['vdir'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       $rp = $this->path_parts(array(
+                                       'string'        => $data['rdir'],
+                                       'relatives'     => 
array($data['relatives'][1])
+                               )
+                       );
+
+                       if(!$this->acl_check(array(
+                                       'string'        => $vp->fake_full_path,
+                                       'relatives'     => array($vp->mask),
+                                       'operation'     => PHPGW_ACL_ADD
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       if($this->file_exists(array(
+                                       'string'        => $rp->real_full_path,
+                                       'relatives'     => array($rp->mask)
+                               ))
+                       )
+                       {
+                               if(!$this->fileoperation->is_dir($rp))
+                               {
+                                       return false;
+                               }
+                       }
+                       elseif(!$this->fileoperation->mkdir($rp))
+                       {
+                               return false;
+                       }
+
+                       if(!$this->mkdir(array(
+                                       'string'        => $vp->fake_full_path,
+                                       'relatives'     => array($vp->mask)
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       //FIXME
+                       $size = $this->get_size(array(
+                                       'string'        => $rp->real_full_path,
+                                       'relatives'     => array($rp->mask)
+                               )
+                       );
+
+                       $this->set_attributes(array(
+                                       'string'        => $vp->fake_full_path,
+                                       'relatives'     => array($vp->mask),
+                                       'attributes'    => array(
+                                                               
'link_directory' => $rp->real_leading_dirs,
+                                                               'link_name' => 
$rp->real_name,
+                                                               'size' => $size
+                                                       )
+                               )
+                       );
+
+                       $this->correct_attributes(array(
+                                       'string'        => $vp->fake_full_path,
+                                       'relatives'     => array($vp->mask)
+                               )
+                       );
+
+                       return true;
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function set_attributes($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                               (
+                                       'relatives'     => 
array(RELATIVE_CURRENT),
+                                       'attributes'    => array()
+                               );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       /*
+                          This is kind of trivial, given that set_attributes() 
can change owner_id,
+                          size, etc.
+                       */
+                       if(!$this->acl_check(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask),
+                                       'operation'     => PHPGW_ACL_EDIT
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       if(!$this->file_exists(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       /*
+                          All this voodoo just decides which attributes to 
update
+                          depending on if the attribute was supplied in the 
'attributes' array
+                       */
+
+                       $ls_array = $this->ls(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask),
+                                       'checksubdirs'  => false,
+                                       'nofiles'       => true
+                               )
+                       );
+                       $record = $ls_array[0];
+
+                       $sql = 'UPDATE phpgw_vfs SET ';
+
+                       $change_attributes = 0;
+                       $edited_comment = false;
+
+                       reset($this->attributes);
+                       $value_set = array();
+//                     while(list($num, $attribute) = each($this->attributes))
+                       foreach($this->attributes as $num => $attribute)
+                       {
+                               if(isset($data['attributes'][$attribute]))
+                               {
+                                       $$attribute = 
$data['attributes'][$attribute];
+
+                                       /*
+                                          Indicate that the EDITED_COMMENT 
operation needs to be journaled,
+                                          but only if the comment changed
+                                       */
+                                       if($attribute == 'comment' && 
$data['attributes'][$attribute] != $record[$attribute])
+                                       {
+                                               $edited_comment = true;
+                                       }
+
+                                       if($attribute == 'owner_id' && 
!$$attribute)
+                                       {
+                                               $$attribute = 
$GLOBALS['phpgw_info']['user']['account_id'];
+                                       }
+
+                                       $$attribute = 
$this->clean_string(array('string' => $$attribute));
+
+/*
+                                       if($change_attributes > 0)
+                                       {
+                                               $sql .= ', ';
+                                       }
+
+                                       $sql .= "$attribute='" . $$attribute . 
"'";
+*/
+                                       $value_set[$attribute] = $$attribute;
+
+                                       $change_attributes++;
+                               }
+                       }
+
+                       if( $change_attributes )
+                       {
+                               $value_set      = 
$GLOBALS['phpgw']->db->validate_update($value_set);
+                               $sql .= " {$value_set} WHERE file_id=" 
.(int)$record['file_id'];
+                               $sql .= $this->extra_sql(array('query_type' => 
VFS_SQL_UPDATE));
+
+                               //echo 'sql: ' . $sql;
+
+                               $query = $GLOBALS['phpgw']->db->query($sql, 
__LINE__, __FILE__);
+                               if($query)
+                               {
+                                       if($edited_comment)
+                                       {
+                                               $this->add_journal(array(
+                                                               'string'        
=> $p->fake_full_path,
+                                                               'relatives'     
=> array($p->mask),
+                                                               'operation'     
=> VFS_OPERATION_EDITED_COMMENT
+                                                       )
+                                               );
+                                       }
+
+                                       return true;
+                               }
+                               else
+                               {
+                                       return false;
+                               }
+                       }
+                       else
+                       {
+                               //Nothing was done, because nothing required !
+                               //This is a kind of bug isn't it ?
+                               //So I let people choose to debug here :/
+                               //FIXME : decide what we are doing here !
+                               return true;
+                       }
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function file_type($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                               (
+                                       'relatives'     => 
array(RELATIVE_CURRENT)
+                               );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       if(!$this->acl_check(array(
+                                       'string'        => $p->fake_full_path,
+                                       'relatives'     => array($p->mask),
+                                       'operation'     => PHPGW_ACL_READ,
+                                       'must_exist'    => true
+                               ))
+                       )
+                       {
+                               return false;
+                       }
+
+                       if($p->outside)
+                       {
+                               if(is_dir($p->real_full_path))
+                               {
+                                       return('Directory');
+                               }
+
+                               /*
+                                  We don't return an empty string here, 
because it may still match with a database query
+                                  because of linked directories
+                               */
+                       }
+
+                       /*
+                          We don't use ls() because it calls file_type() to 
determine if it has been
+                          passed a directory
+                       */
+                       $db2 = clone($GLOBALS['phpgw']->db);
+                       $db2->query("SELECT mime_type FROM phpgw_vfs WHERE 
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" . 
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+                       $db2->next_record();
+                       $mime_type = $db2->f('mime_type');
+                       if(!$mime_type)
+                       {
+                               $mime_type = 
$this->get_ext_mime_type(array('string' => $data['string']));
+                               {
+                                       $db2->query("UPDATE phpgw_vfs SET 
mime_type='{$mime_type}' WHERE directory='{$p->fake_leading_dirs_clean}' AND 
name='{$p->fake_name_clean}'" . $this->extra_sql(array('query_type' => 
VFS_SQL_SELECT)), __LINE__, __FILE__);
+                               }
+                       }
+
+                       return $mime_type;
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function file_exists($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                               (
+                                       'relatives'     => 
array(RELATIVE_CURRENT)
+                               );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       if($p->outside)
+                       {
+                               $rr = file_exists($p->real_full_path);
+
+                               return $rr;
+                       }
+
+                       $db2 = clone($GLOBALS['phpgw']->db);
+                       $db2->query("SELECT name FROM phpgw_vfs WHERE 
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" . 
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+
+                       if($db2->next_record())
+                       {
+                               return true;
+                       }
+                       else
+                       {
+                               return false;
+                       }
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function get_size($data)
+               {
+                       $size = parent::get_size($data);
+                       /*XXX Caeies : Not sure about this, but ... */
+                       /* If the virtual size is always 4096, we don't need 
this ... */
+/*                     if($data['checksubdirs'])
+                       {
+                               $query = $GLOBALS['phpgw']->db->query("SELECT 
size FROM phpgw_vfs WHERE directory='".$p->fake_leading_dirs_clean."' AND 
name='".$p->fake_name_clean."'" . $this->extra_sql(array('query_text' => 
VFS_SQL_SELECT)));
+                               $GLOBALS['phpgw']->db->next_record();
+                               $size += $GLOBALS['phpgw']->db->Record[0];
+                       }
+*/
+                       return $size;
+               }
+
+               /* temporary wrapper function for not working Record function 
in adodb layer(ceb)*/
+               function Record()
+               {
+                       $values = array();
+                       foreach($this->attributes as $attribute)
+                       {
+                               $values[$attribute] = 
$GLOBALS['phpgw']->db->f($attribute);
+                       }
+                       return $values;
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function ls($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                       (
+                               'relatives'     => array(RELATIVE_CURRENT),
+                               'checksubdirs'  => true,
+                               'mime_type'     => false,
+                               'nofiles'       => false,
+                               'orderby'       => 'directory'
+                       );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+                       //_debug_array($data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       //_debug_array($p);
+
+                       $ftype = $this->file_type( array('string' => 
$p->fake_full_path, 'relatives' => array($p->mask) ) );
+                       /* If they pass us a file or 'nofiles' is set, return 
the info for $dir only */
+                       if(($ftype != 'Directory' || $data['nofiles'] ) && 
!$p->outside)
+                       {
+                               /* SELECT all, the, attributes */
+                               $sql = 'SELECT ' . implode(', ', 
$this->attributes)
+                                               . " FROM phpgw_vfs WHERE 
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}' "
+                                               . 
$this->extra_sql(array('query_type' => VFS_SQL_SELECT));
+
+                               $query = $GLOBALS['phpgw']->db->query($sql, 
__LINE__, __FILE__);
+                               if($GLOBALS['phpgw']->db->num_rows() == 0)
+                               {
+                                       return array();
+                               }
+                               $GLOBALS['phpgw']->db->next_record();
+                               $record = $this->Record();
+                               //echo 'record: ' . _debug_array($record);
+
+                               /* We return an array of one array to maintain 
the standard */
+                               $rarray = array();
+                               reset($this->attributes);
+                               while(list($num, $attribute) = 
each($this->attributes))
+                               {
+                                       if($attribute == 'mime_type' && 
!$record[$attribute])
+                                       {
+                                               $db2 = 
clone($GLOBALS['phpgw']->db);
+                                               $record[$attribute] = 
$this->get_ext_mime_type(array(
+                                                               'string' => 
$p->fake_name_clean
+                                                       )
+                                               );
+
+                                               if($record[$attribute])
+                                               {
+                                                       $db2->query("UPDATE 
phpgw_vfs SET mime_type='{$record[$attribute]}' WHERE 
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" . 
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+                                               }
+                                       }
+
+                                       $rarray[0][$attribute] = 
$record[$attribute];
+                               }
+
+                               return $rarray;
+                       }
+
+                       //WIP - this should recurse using the same options the 
virtual part of ls() does
+                       /* If $dir is outside the virutal root, we have to 
check the file system manually */
+                       if($p->outside)
+                       {
+                               if($this->file_type(array(
+                                               'string'        => 
$p->fake_full_path,
+                                               'relatives'     => 
array($p->mask)
+                                       )) == 'Directory'
+                                       && !$data['nofiles']
+                               )
+                               {
+                                       $dir_handle = 
opendir($p->real_full_path);
+                                       while($filename = readdir($dir_handle))
+                                       {
+                                               if($filename == '.' || 
$filename == '..')
+                                               {
+                                                       continue;
+                                               }
+                                               $rarray[] = 
$this->get_real_info(array(
+                                                               'string'        
=> "{$p->real_full_path}/{$filename}",
+                                                               'relatives'     
=> array($p->mask)
+                                                       )
+                                               );
+                                       }
+                               }
+                               else
+                               {
+                                       $rarray[] = $this->get_real_info(array(
+                                                       'string'        => 
$p->real_full_path,
+                                                       'relatives'     => 
array($p->mask)
+                                               )
+                                       );
+                               }
+
+                               return $rarray;
+                       }
+
+                       /* $dir's not a file, is inside the virtual root, and 
they want to check subdirs */
+                       /* SELECT all, the, attributes FROM phpgw_vfs WHERE 
file=$dir */
+                       $sql = 'SELECT ' . implode(',', $this->attributes);
+
+                       $dir_clean = $this->clean_string(array('string' => 
$p->fake_full_path));
+                       $sql .= " FROM phpgw_vfs WHERE directory LIKE 
'$dir_clean%'";
+                       $sql .= $this->extra_sql(array('query_type' => 
VFS_SQL_SELECT));
+
+                       if($data['mime_type'])
+                       {
+                               $sql .= " AND 
mime_type='".$data['mime_type']."'";
+                       }
+
+                       $sql .= ' ORDER BY '.$data['orderby'];
+
+                       $query = $GLOBALS['phpgw']->db->query($sql, __LINE__, 
__FILE__);
+
+                       $rarray = array();
+                       while( $GLOBALS['phpgw']->db->next_record() )
+                       {
+                               $record = $this->Record();
+
+                               //_debug_array($record);
+                               /* Further checking on the directory.  This 
makes sure /home/user/test won't match /home/user/test22 */
+                               if(address@hidden("^{$p->fake_full_path}(/|$)", 
$record['directory']))
+                               {
+                                       continue;
+                               }
+
+                               /* If they want only this directory, then $dir 
should end without a trailing / */
+                               if(!$data['checksubdirs'] && 
ereg("^{$p->fake_full_path}/", $record['directory']))
+                               {
+                                       continue;
+                               }
+
+                               $db2 = clone($GLOBALS['phpgw']->db);
+                               if( isset($this->attributes['mime_type']) && 
!isset($record['mime_type']) )
+                               {
+                                       $record['mime_type'] == 
$this->get_ext_mime_type(array('string' => $p->fake_name_clean));
+
+                                       if( $record['mime_type'] )
+                                       {
+                                               $db2->query("UPDATE phpgw_vfs 
SET mime_type='{$record[$attribute]}' WHERE 
directory='{$p->fake_leading_dirs_clean}' AND name='{$p->fake_name_clean}'" . 
$this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+
+                                       }
+                               }
+                               $rarray[] = $record;
+                       }
+                       return $rarray;
+               }
+
+               /*
+                * See vfs_shared
+                */
+               function update_real($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                               (
+                                       'relatives'     => 
array(RELATIVE_CURRENT)
+                               );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       if(file_exists($p->real_full_path))
+                       {
+                               if(is_dir($p->real_full_path))
+                               {
+                                       $dir_handle = 
opendir($p->real_full_path);
+                                       while($filename = readdir($dir_handle))
+                                       {
+                                               if($filename == '.' || 
$filename == '..')
+                                               {
+                                                       continue;
+                                               }
+
+                                               $rarray[] = 
$this->get_real_info(array(
+                                                               'string'        
=> $p->fake_full_path . '/' . $filename,
+                                                               'relatives'     
=> array(RELATIVE_NONE)
+                                                       )
+                                               );
+                                       }
+                               }
+                               else
+                               {
+                                       $rarray[] = $this->get_real_info(array(
+                                                       'string'        => 
$p->fake_full_path,
+                                                       'relatives'     => 
array(RELATIVE_NONE)
+                                               )
+                                       );
+                               }
+
+                               if(!is_array($rarray))
+                               {
+                                       $rarray = array();
+                               }
+
+                               while(list($num, $file_array) = each($rarray))
+                               {
+                                       $p2 = $this->path_parts(array(
+                                                       'string'        => 
$file_array['directory'] . '/' . $file_array['name'],
+                                                       'relatives'     => 
array(RELATIVE_NONE)
+                                               )
+                                       );
+
+                                       /* Note the mime_type.  This can be 
"Directory", which is how we create directories */
+                                       $set_attributes_array = Array(
+                                               'size' => $file_array['size'],
+                                               'mime_type' => 
$file_array['mime_type']
+                                       );
+
+                                       if(!$this->file_exists(array(
+                                                       'string'        => 
$p2->fake_full_path,
+                                                       'relatives'     => 
array(RELATIVE_NONE)
+                                               ))
+                                       )
+                                       {
+                                               $this->touch(array(
+                                                               'string'        
=> $p2->fake_full_path,
+                                                               'relatives'     
=> array(RELATIVE_NONE)
+                                                       )
+                                               );
+
+                                               $this->set_attributes(array(
+                                                               'string'        
=> $p2->fake_full_path,
+                                                               'relatives'     
=> array(RELATIVE_NONE),
+                                                               'attributes'    
=> $set_attributes_array
+                                                       )
+                                               );
+                                       }
+                                       else
+                                       {
+                                               $this->set_attributes(array(
+                                                               'string'        
=> $p2->fake_full_path,
+                                                               'relatives'     
=> array(RELATIVE_NONE),
+                                                               'attributes'    
=> $set_attributes_array
+                                                       )
+                                               );
+                                       }
+                               }
+                       }
+               }
+
+               /* Helper functions */
+
+               /* This fetchs all available file system information for 
string(not using the database) */
+               function get_real_info($data)
+               {
+                       if(!is_array($data))
+                       {
+                               $data = array();
+                       }
+
+                       $default_values = array
+                               (
+                                       'relatives'     => 
array(RELATIVE_CURRENT)
+                               );
+
+                       $data = array_merge($this->default_values($data, 
$default_values), $data);
+
+                       $p = $this->path_parts(array(
+                                       'string'        => $data['string'],
+                                       'relatives'     => 
array($data['relatives'][0])
+                               )
+                       );
+
+                       if(is_dir($p->real_full_path))
+                       {
+                               $mime_type = 'Directory';
+                       }
+                       else
+                       {
+                               $mime_type = $this->get_ext_mime_type(array(
+                                               'string'        => $p->fake_name
+                                       )
+                               );
+
+                               if($mime_type)
+                               {
+                                       $GLOBALS['phpgw']->db->query("UPDATE 
phpgw_vfs SET mime_type='".$mime_type."' WHERE 
directory='".$p->fake_leading_dirs_clean."' AND name='".$p->fake_name_clean."'" 
. $this->extra_sql(array('query_type' => VFS_SQL_SELECT)), __LINE__, __FILE__);
+                               }
+                       }
+
+                       $size = filesize($p->real_full_path);
+                       $rarray = array(
+                               'directory' => $p->fake_leading_dirs,
+                               'name' => $p->fake_name,
+                               'size' => $size,
+                               'mime_type' => $mime_type
+                       );
+
+                       return($rarray);
+               }
+       }

Copied: 
branches/Version-1_0-branch/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php
 (from rev 11619, trunk/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php)
===================================================================
--- 
branches/Version-1_0-branch/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php
                           (rev 0)
+++ 
branches/Version-1_0-branch/phpgwapi/inc/class.vfs_fileoperation_braArkiv.inc.php
   2014-01-22 17:26:09 UTC (rev 11620)
@@ -0,0 +1,128 @@
+<?php
+       /**
+       * Fileoperation
+       * @author Sigurd Nes <address@hidden>
+       * @copyright Copyright (C) 2014 Free Software Foundation, Inc. 
http://www.fsf.org/
+       * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General 
Public License v2 or later
+       * @package phpgwapi
+       * @subpackage vfs
+       * @version $Id: class.acl.inc.php 11567 2013-12-23 12:49:00Z sigurdne $
+       */
+
+       /*
+               This program is free software: you can redistribute it and/or 
modify
+               it under the terms of the GNU Lesser General Public License as 
published by
+               the Free Software Foundation, either version 2 of the License, 
or
+               (at your option) any later version.
+
+               This program 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 Lesser General Public License for more details.
+
+               You should have received a copy of the GNU Lesser General 
Public License
+               along with this program.  If not, see 
<http://www.gnu.org/licenses/>.
+        */
+
+       class phpgwapi_vfs_fileoperation_braArkiv
+       {
+               public function __construct()
+               {
+
+               }
+
+               public function filesize($path_parts)
+               {
+                       $path = $path_parts->real_full_path;
+                       return filesize($path);
+               }
+
+               public function read($path_parts)
+               {
+                       $path = $path_parts->real_full_path;
+                       $contents = null;
+                       if( $filesize = $this->filesize($path) > 0 && $fp = 
fopen($path, 'rb'))
+                       {
+                               $contents = fread($fp, $filesize);
+                               fclose ($fp);
+                       }
+                       return $contents;
+               }
+
+               //not relevant to braArkiv
+               public function copy($from, $to)
+               {
+                       return copy($from->real_full_path, $to->real_full_path);
+               }
+
+
+               public function write($path_parts, $content)
+               {
+                       $write_ok = false;
+                       if($fp = fopen($path_parts->real_full_path, 'wb'))
+                       {
+                               fwrite($fp, $content, strlen($content));
+                               fclose($fp);
+                               $write_ok = true;
+                       }
+                       return $write_ok;
+               }
+
+
+               public function touch($path_parts)
+               {
+                       return @touch($path_parts->real_full_path);
+               }
+
+               public function rename($from, $to)
+               {
+                       return rename($from->real_full_path, 
$to->real_full_path);
+               }
+
+               /*
+               *Deletes a file
+               */
+               public function unlink($path_parts)
+               {
+                       return unlink($path_parts->real_full_path);
+               }
+
+               /*
+               *Removes directory
+               */
+               public function rmdir($path_parts)
+               {
+                       return rmdir($path_parts->real_full_path);
+               }
+
+               public function check_target_directory($path_parts)
+               {
+                       return file_exists($path_parts->real_leading_dirs);
+               }
+
+               public function auto_create_home($basedir)
+               {
+                       if(!file_exists($basedir.'/home'))
+                       {
+                               @mkdir($basedir.'/home', 0770);
+                       }
+               }
+
+               public function file_exists($path_parts)
+               {
+                       return file_exists($path_parts->real_full_path);
+               }
+
+               public function is_dir($path_parts)
+               {
+                       return is_dir($path_parts->real_full_path);
+               }
+
+               public function mkdir($path_parts)
+               {
+                       return mkdir($path_parts->real_full_path, 0770);
+               }
+
+
+
+       }

Modified: branches/Version-1_0-branch/phpgwapi/setup/setup.inc.php
===================================================================
--- branches/Version-1_0-branch/phpgwapi/setup/setup.inc.php    2014-01-22 
16:34:43 UTC (rev 11619)
+++ branches/Version-1_0-branch/phpgwapi/setup/setup.inc.php    2014-01-22 
17:26:09 UTC (rev 11620)
@@ -12,7 +12,7 @@
        // Basic information about this app
        $setup_info['phpgwapi']['name']      = 'phpgwapi';
        $setup_info['phpgwapi']['title']     = 'phpgwapi';
-       $setup_info['phpgwapi']['version']   = '0.9.17.542';
+       $setup_info['phpgwapi']['version']   = '0.9.17.543';
        $setup_info['phpgwapi']['versions']['current_header'] = '1.31';
        $setup_info['phpgwapi']['versions']['system'] = '1.0';
        $setup_info['phpgwapi']['enable']    = 3;

Modified: branches/Version-1_0-branch/phpgwapi/setup/tables_current.inc.php
===================================================================
--- branches/Version-1_0-branch/phpgwapi/setup/tables_current.inc.php   
2014-01-22 16:34:43 UTC (rev 11619)
+++ branches/Version-1_0-branch/phpgwapi/setup/tables_current.inc.php   
2014-01-22 17:26:09 UTC (rev 11620)
@@ -289,7 +289,8 @@
                                'link_directory' => array('type' => 
'text','nullable' => True),
                                'link_name' => array('type' => 
'text','nullable' => True),
                                'version' => array('type' => 
'varchar','precision' => 30,'nullable' => False,'default' => '0.0.0.0'),
-                               'content' => array('type' => 'text','nullable' 
=> True)
+                               'content' => array('type' => 'text','nullable' 
=> True),
+                               'external_id' => array('type' => 
'int','precision' => 8,'nullable' => True),
                        ),
                        'pk' => array('file_id'),
                        'fk' => array(),

Modified: branches/Version-1_0-branch/phpgwapi/setup/tables_update.inc.php
===================================================================
--- branches/Version-1_0-branch/phpgwapi/setup/tables_update.inc.php    
2014-01-22 16:34:43 UTC (rev 11619)
+++ branches/Version-1_0-branch/phpgwapi/setup/tables_update.inc.php    
2014-01-22 17:26:09 UTC (rev 11620)
@@ -3155,36 +3155,26 @@
                }
        }
 
-/*
+
        $test[] = '0.9.17.542';
+       /**
+       * Enable external integration with vfs
+       *
+       * @return string the new version number
+       */
        function phpgwapi_upgrade0_9_17_542()
        {
                $GLOBALS['phpgw_setup']->oProc->m_odb->transaction_begin();
 
-               
$GLOBALS['phpgw_setup']->oProc->AlterColumn('phpgw_cust_attribute','location_id',array(
+               
$GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_vfs','external_id', array(
                        'type' => 'int',
-                       'precision' => 4,
-                       'nullable' => false,
+                       'precision' => 8,
+                       'nullable' => true
                ));
-               
$GLOBALS['phpgw_setup']->oProc->AlterColumn('phpgw_cust_attribute','id',array(
-                       'type' => 'int',
-                       'precision' => 4,
-                       'nullable' => false,
-               ));
 
-               
$GLOBALS['phpgw_setup']->oProc->AlterColumn('phpgw_cust_attribute','group_id',array(
-                       'type' => 'int',
-                       'precision' => 4,
-                       'nullable' => true,
-                       'default' => 0
-               ));
-
                if($GLOBALS['phpgw_setup']->oProc->m_odb->transaction_commit())
                {
                        $GLOBALS['setup_info']['phpgwapi']['currentver'] = 
'0.9.17.543';
                        return $GLOBALS['setup_info']['phpgwapi']['currentver'];
                }
        }
-
-*/
-

Modified: branches/Version-1_0-branch/property/inc/export/default/Agresso_X114
===================================================================
--- branches/Version-1_0-branch/property/inc/export/default/Agresso_X114        
2014-01-22 16:34:43 UTC (rev 11619)
+++ branches/Version-1_0-branch/property/inc/export/default/Agresso_X114        
2014-01-22 17:26:09 UTC (rev 11620)
@@ -930,10 +930,14 @@
 
                        if($accountline)
                        {
+                               $this->db->query('SELECT category FROM 
fm_vendor WHERE id=' . (int) $oRsBilag[0]['spvend_code']);
+                               $this->db->next_record();
+                               $_vendor_category = $this->db->f('category');
+
                                $accountline[] = array
                                (
                                        'TRANSACTIONTYPE'               => 
'R114',
-                                       'ACCOUNTLINK.CODE'              => 2400,
+                                       'ACCOUNTLINK.CODE'              => 
$_vendor_category == 1 ? 2400 : 2460,
                                        'CURRENCY'                              
=> $oRsBilag[0]['currency'],
                                        'AMOUNT'                                
=> (-1 * $sum_amount),
                                        'TAXCODE'                               
=> $oRsBilag[0]['mvakode'],




reply via email to

[Prev in Thread] Current Thread [Next in Thread]