@@ -10,128 +10,128 @@ |
||
10 | 10 | */ |
11 | 11 | |
12 | 12 | class SyncRecurrence extends SyncObject { |
13 | - public $type; |
|
14 | - public $until; |
|
15 | - public $occurrences; |
|
16 | - public $interval; |
|
17 | - public $dayofweek; |
|
18 | - public $dayofmonth; |
|
19 | - public $weekofmonth; |
|
20 | - public $monthofyear; |
|
21 | - public $calendartype; |
|
22 | - public $firstdayofweek; |
|
13 | + public $type; |
|
14 | + public $until; |
|
15 | + public $occurrences; |
|
16 | + public $interval; |
|
17 | + public $dayofweek; |
|
18 | + public $dayofmonth; |
|
19 | + public $weekofmonth; |
|
20 | + public $monthofyear; |
|
21 | + public $calendartype; |
|
22 | + public $firstdayofweek; |
|
23 | 23 | |
24 | - public function __construct() { |
|
25 | - $mapping = [ |
|
26 | - // Recurrence type |
|
27 | - // 0 = Recurs daily |
|
28 | - // 1 = Recurs weekly |
|
29 | - // 2 = Recurs monthly |
|
30 | - // 3 = Recurs monthly on the nth day |
|
31 | - // 5 = Recurs yearly |
|
32 | - // 6 = Recurs yearly on the nth day |
|
33 | - SYNC_POOMCAL_TYPE => [ |
|
34 | - self::STREAMER_VAR => "type", |
|
35 | - self::STREAMER_CHECKS => [ |
|
36 | - self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO, |
|
37 | - self::STREAMER_CHECK_ONEVALUEOF => [0, 1, 2, 3, 5, 6], |
|
38 | - ], |
|
39 | - self::STREAMER_RONOTIFY => true, |
|
40 | - ], |
|
41 | - SYNC_POOMCAL_UNTIL => [ |
|
42 | - self::STREAMER_VAR => "until", |
|
43 | - self::STREAMER_TYPE => self::STREAMER_TYPE_DATE, |
|
44 | - self::STREAMER_RONOTIFY => true, |
|
45 | - ], |
|
46 | - SYNC_POOMCAL_OCCURRENCES => [ |
|
47 | - self::STREAMER_VAR => "occurrences", |
|
48 | - self::STREAMER_CHECKS => [ |
|
49 | - self::STREAMER_CHECK_CMPHIGHER => 0, |
|
50 | - self::STREAMER_CHECK_CMPLOWER => 1000, |
|
51 | - ], |
|
52 | - self::STREAMER_RONOTIFY => true, |
|
53 | - ], |
|
54 | - SYNC_POOMCAL_INTERVAL => [ |
|
55 | - self::STREAMER_VAR => "interval", |
|
56 | - self::STREAMER_CHECKS => [ |
|
57 | - self::STREAMER_CHECK_CMPHIGHER => 0, |
|
58 | - self::STREAMER_CHECK_CMPLOWER => 1000, |
|
59 | - ], |
|
60 | - self::STREAMER_RONOTIFY => true, |
|
61 | - ], |
|
62 | - // DayOfWeek values |
|
63 | - // 1 = Sunday |
|
64 | - // 2 = Monday |
|
65 | - // 4 = Tuesday |
|
66 | - // 8 = Wednesday |
|
67 | - // 16 = Thursday |
|
68 | - // 32 = Friday |
|
69 | - // 62 = Weekdays // not in spec: daily weekday recurrence |
|
70 | - // 64 = Saturday |
|
71 | - // 127 = The last day of the month. Value valid only in monthly or yearly recurrences. |
|
72 | - // As this is a bitmask, actually all values 0 > x < 128 are allowed |
|
73 | - SYNC_POOMCAL_DAYOFWEEK => [ |
|
74 | - self::STREAMER_VAR => "dayofweek", |
|
75 | - self::STREAMER_CHECKS => [ |
|
76 | - self::STREAMER_CHECK_CMPHIGHER => 0, |
|
77 | - self::STREAMER_CHECK_CMPLOWER => 128, |
|
78 | - ], |
|
79 | - self::STREAMER_RONOTIFY => true, |
|
80 | - ], |
|
81 | - // DayOfMonth values |
|
82 | - // 1-31 representing the day |
|
83 | - SYNC_POOMCAL_DAYOFMONTH => [ |
|
84 | - self::STREAMER_VAR => "dayofmonth", |
|
85 | - self::STREAMER_CHECKS => [ |
|
86 | - self::STREAMER_CHECK_CMPHIGHER => 0, |
|
87 | - self::STREAMER_CHECK_CMPLOWER => 32, |
|
88 | - ], |
|
89 | - self::STREAMER_RONOTIFY => true, |
|
90 | - ], |
|
91 | - // WeekOfMonth |
|
92 | - // 1-4 = Y st/nd/rd/th week of month |
|
93 | - // 5 = last week of month |
|
94 | - SYNC_POOMCAL_WEEKOFMONTH => [ |
|
95 | - self::STREAMER_VAR => "weekofmonth", |
|
96 | - self::STREAMER_CHECKS => [self::STREAMER_CHECK_ONEVALUEOF => [1, 2, 3, 4, 5]], |
|
97 | - self::STREAMER_RONOTIFY => true, |
|
98 | - ], |
|
99 | - // MonthOfYear |
|
100 | - // 1-12 representing the month |
|
101 | - SYNC_POOMCAL_MONTHOFYEAR => [ |
|
102 | - self::STREAMER_VAR => "monthofyear", |
|
103 | - self::STREAMER_CHECKS => [self::STREAMER_CHECK_ONEVALUEOF => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]], |
|
104 | - self::STREAMER_RONOTIFY => true, |
|
105 | - ], |
|
106 | - ]; |
|
24 | + public function __construct() { |
|
25 | + $mapping = [ |
|
26 | + // Recurrence type |
|
27 | + // 0 = Recurs daily |
|
28 | + // 1 = Recurs weekly |
|
29 | + // 2 = Recurs monthly |
|
30 | + // 3 = Recurs monthly on the nth day |
|
31 | + // 5 = Recurs yearly |
|
32 | + // 6 = Recurs yearly on the nth day |
|
33 | + SYNC_POOMCAL_TYPE => [ |
|
34 | + self::STREAMER_VAR => "type", |
|
35 | + self::STREAMER_CHECKS => [ |
|
36 | + self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO, |
|
37 | + self::STREAMER_CHECK_ONEVALUEOF => [0, 1, 2, 3, 5, 6], |
|
38 | + ], |
|
39 | + self::STREAMER_RONOTIFY => true, |
|
40 | + ], |
|
41 | + SYNC_POOMCAL_UNTIL => [ |
|
42 | + self::STREAMER_VAR => "until", |
|
43 | + self::STREAMER_TYPE => self::STREAMER_TYPE_DATE, |
|
44 | + self::STREAMER_RONOTIFY => true, |
|
45 | + ], |
|
46 | + SYNC_POOMCAL_OCCURRENCES => [ |
|
47 | + self::STREAMER_VAR => "occurrences", |
|
48 | + self::STREAMER_CHECKS => [ |
|
49 | + self::STREAMER_CHECK_CMPHIGHER => 0, |
|
50 | + self::STREAMER_CHECK_CMPLOWER => 1000, |
|
51 | + ], |
|
52 | + self::STREAMER_RONOTIFY => true, |
|
53 | + ], |
|
54 | + SYNC_POOMCAL_INTERVAL => [ |
|
55 | + self::STREAMER_VAR => "interval", |
|
56 | + self::STREAMER_CHECKS => [ |
|
57 | + self::STREAMER_CHECK_CMPHIGHER => 0, |
|
58 | + self::STREAMER_CHECK_CMPLOWER => 1000, |
|
59 | + ], |
|
60 | + self::STREAMER_RONOTIFY => true, |
|
61 | + ], |
|
62 | + // DayOfWeek values |
|
63 | + // 1 = Sunday |
|
64 | + // 2 = Monday |
|
65 | + // 4 = Tuesday |
|
66 | + // 8 = Wednesday |
|
67 | + // 16 = Thursday |
|
68 | + // 32 = Friday |
|
69 | + // 62 = Weekdays // not in spec: daily weekday recurrence |
|
70 | + // 64 = Saturday |
|
71 | + // 127 = The last day of the month. Value valid only in monthly or yearly recurrences. |
|
72 | + // As this is a bitmask, actually all values 0 > x < 128 are allowed |
|
73 | + SYNC_POOMCAL_DAYOFWEEK => [ |
|
74 | + self::STREAMER_VAR => "dayofweek", |
|
75 | + self::STREAMER_CHECKS => [ |
|
76 | + self::STREAMER_CHECK_CMPHIGHER => 0, |
|
77 | + self::STREAMER_CHECK_CMPLOWER => 128, |
|
78 | + ], |
|
79 | + self::STREAMER_RONOTIFY => true, |
|
80 | + ], |
|
81 | + // DayOfMonth values |
|
82 | + // 1-31 representing the day |
|
83 | + SYNC_POOMCAL_DAYOFMONTH => [ |
|
84 | + self::STREAMER_VAR => "dayofmonth", |
|
85 | + self::STREAMER_CHECKS => [ |
|
86 | + self::STREAMER_CHECK_CMPHIGHER => 0, |
|
87 | + self::STREAMER_CHECK_CMPLOWER => 32, |
|
88 | + ], |
|
89 | + self::STREAMER_RONOTIFY => true, |
|
90 | + ], |
|
91 | + // WeekOfMonth |
|
92 | + // 1-4 = Y st/nd/rd/th week of month |
|
93 | + // 5 = last week of month |
|
94 | + SYNC_POOMCAL_WEEKOFMONTH => [ |
|
95 | + self::STREAMER_VAR => "weekofmonth", |
|
96 | + self::STREAMER_CHECKS => [self::STREAMER_CHECK_ONEVALUEOF => [1, 2, 3, 4, 5]], |
|
97 | + self::STREAMER_RONOTIFY => true, |
|
98 | + ], |
|
99 | + // MonthOfYear |
|
100 | + // 1-12 representing the month |
|
101 | + SYNC_POOMCAL_MONTHOFYEAR => [ |
|
102 | + self::STREAMER_VAR => "monthofyear", |
|
103 | + self::STREAMER_CHECKS => [self::STREAMER_CHECK_ONEVALUEOF => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]], |
|
104 | + self::STREAMER_RONOTIFY => true, |
|
105 | + ], |
|
106 | + ]; |
|
107 | 107 | |
108 | - if (Request::GetProtocolVersion() >= 14.0) { |
|
109 | - $mapping[SYNC_POOMCAL_CALENDARTYPE] = [ |
|
110 | - self::STREAMER_VAR => "calendartype", |
|
111 | - self::STREAMER_RONOTIFY => true, ]; |
|
112 | - } |
|
108 | + if (Request::GetProtocolVersion() >= 14.0) { |
|
109 | + $mapping[SYNC_POOMCAL_CALENDARTYPE] = [ |
|
110 | + self::STREAMER_VAR => "calendartype", |
|
111 | + self::STREAMER_RONOTIFY => true, ]; |
|
112 | + } |
|
113 | 113 | |
114 | - if (Request::GetProtocolVersion() >= 14.1) { |
|
115 | - // First day of the calendar week for recurrence. |
|
116 | - // FirstDayOfWeek values: |
|
117 | - // 0 = Sunday |
|
118 | - // 1 = Monday |
|
119 | - // 2 = Tuesday |
|
120 | - // 3 = Wednesday |
|
121 | - // 4 = Thursday |
|
122 | - // 5 = Friday |
|
123 | - // 6 = Saturday |
|
124 | - $mapping[SYNC_POOMCAL_FIRSTDAYOFWEEK] = [ |
|
125 | - self::STREAMER_VAR => "firstdayofweek", |
|
126 | - self::STREAMER_CHECKS => [self::STREAMER_CHECK_ONEVALUEOF => [0, 1, 2, 3, 4, 5, 6]], |
|
127 | - self::STREAMER_RONOTIFY => true, |
|
128 | - ]; |
|
129 | - } |
|
114 | + if (Request::GetProtocolVersion() >= 14.1) { |
|
115 | + // First day of the calendar week for recurrence. |
|
116 | + // FirstDayOfWeek values: |
|
117 | + // 0 = Sunday |
|
118 | + // 1 = Monday |
|
119 | + // 2 = Tuesday |
|
120 | + // 3 = Wednesday |
|
121 | + // 4 = Thursday |
|
122 | + // 5 = Friday |
|
123 | + // 6 = Saturday |
|
124 | + $mapping[SYNC_POOMCAL_FIRSTDAYOFWEEK] = [ |
|
125 | + self::STREAMER_VAR => "firstdayofweek", |
|
126 | + self::STREAMER_CHECKS => [self::STREAMER_CHECK_ONEVALUEOF => [0, 1, 2, 3, 4, 5, 6]], |
|
127 | + self::STREAMER_RONOTIFY => true, |
|
128 | + ]; |
|
129 | + } |
|
130 | 130 | |
131 | - parent::__construct($mapping); |
|
131 | + parent::__construct($mapping); |
|
132 | 132 | |
133 | - // Indicates that this SyncObject supports the private flag and stripping of private data. |
|
134 | - // There is nothing concrete to be stripped here, but as it's part of an appointment it supports it. |
|
135 | - $this->supportsPrivateStripping = true; |
|
136 | - } |
|
133 | + // Indicates that this SyncObject supports the private flag and stripping of private data. |
|
134 | + // There is nothing concrete to be stripped here, but as it's part of an appointment it supports it. |
|
135 | + $this->supportsPrivateStripping = true; |
|
136 | + } |
|
137 | 137 | } |
@@ -10,21 +10,21 @@ |
||
10 | 10 | */ |
11 | 11 | |
12 | 12 | class SyncResolveRecipientsAvailability extends SyncObject { |
13 | - public $starttime; |
|
14 | - public $endtime; |
|
15 | - public $status; |
|
16 | - public $mergedfreebusy; |
|
13 | + public $starttime; |
|
14 | + public $endtime; |
|
15 | + public $status; |
|
16 | + public $mergedfreebusy; |
|
17 | 17 | |
18 | - public function __construct() { |
|
19 | - $mapping = []; |
|
18 | + public function __construct() { |
|
19 | + $mapping = []; |
|
20 | 20 | |
21 | - if (Request::GetProtocolVersion() >= 14.0) { |
|
22 | - $mapping[SYNC_RESOLVERECIPIENTS_STARTTIME] = [self::STREAMER_VAR => "starttime"]; |
|
23 | - $mapping[SYNC_RESOLVERECIPIENTS_ENDTIME] = [self::STREAMER_VAR => "endtime"]; |
|
24 | - $mapping[SYNC_RESOLVERECIPIENTS_STATUS] = [self::STREAMER_VAR => "status"]; |
|
25 | - $mapping[SYNC_RESOLVERECIPIENTS_MERGEDFREEBUSY] = [self::STREAMER_VAR => "mergedfreebusy"]; |
|
26 | - } |
|
21 | + if (Request::GetProtocolVersion() >= 14.0) { |
|
22 | + $mapping[SYNC_RESOLVERECIPIENTS_STARTTIME] = [self::STREAMER_VAR => "starttime"]; |
|
23 | + $mapping[SYNC_RESOLVERECIPIENTS_ENDTIME] = [self::STREAMER_VAR => "endtime"]; |
|
24 | + $mapping[SYNC_RESOLVERECIPIENTS_STATUS] = [self::STREAMER_VAR => "status"]; |
|
25 | + $mapping[SYNC_RESOLVERECIPIENTS_MERGEDFREEBUSY] = [self::STREAMER_VAR => "mergedfreebusy"]; |
|
26 | + } |
|
27 | 27 | |
28 | - parent::__construct($mapping); |
|
29 | - } |
|
28 | + parent::__construct($mapping); |
|
29 | + } |
|
30 | 30 | } |
@@ -10,19 +10,19 @@ |
||
10 | 10 | */ |
11 | 11 | |
12 | 12 | class SyncSendMailSource extends SyncObject { |
13 | - public $folderid; |
|
14 | - public $itemid; |
|
15 | - public $longid; |
|
16 | - public $instanceid; |
|
13 | + public $folderid; |
|
14 | + public $itemid; |
|
15 | + public $longid; |
|
16 | + public $instanceid; |
|
17 | 17 | |
18 | - public function __construct() { |
|
19 | - $mapping = [ |
|
20 | - SYNC_COMPOSEMAIL_FOLDERID => [self::STREAMER_VAR => "folderid"], |
|
21 | - SYNC_COMPOSEMAIL_ITEMID => [self::STREAMER_VAR => "itemid"], |
|
22 | - SYNC_COMPOSEMAIL_LONGID => [self::STREAMER_VAR => "longid"], |
|
23 | - SYNC_COMPOSEMAIL_INSTANCEID => [self::STREAMER_VAR => "instanceid"], |
|
24 | - ]; |
|
18 | + public function __construct() { |
|
19 | + $mapping = [ |
|
20 | + SYNC_COMPOSEMAIL_FOLDERID => [self::STREAMER_VAR => "folderid"], |
|
21 | + SYNC_COMPOSEMAIL_ITEMID => [self::STREAMER_VAR => "itemid"], |
|
22 | + SYNC_COMPOSEMAIL_LONGID => [self::STREAMER_VAR => "longid"], |
|
23 | + SYNC_COMPOSEMAIL_INSTANCEID => [self::STREAMER_VAR => "instanceid"], |
|
24 | + ]; |
|
25 | 25 | |
26 | - parent::__construct($mapping); |
|
27 | - } |
|
26 | + parent::__construct($mapping); |
|
27 | + } |
|
28 | 28 | } |
@@ -10,23 +10,23 @@ |
||
10 | 10 | */ |
11 | 11 | |
12 | 12 | class SyncRightsManagementTemplates extends SyncObject { |
13 | - public $rmtemplates; |
|
14 | - public $Status; |
|
13 | + public $rmtemplates; |
|
14 | + public $Status; |
|
15 | 15 | |
16 | - public function __construct() { |
|
17 | - $mapping = [ |
|
18 | - SYNC_RIGHTSMANAGEMENT_TEMPLATES => [ |
|
19 | - self::STREAMER_VAR => "rmtemplates", |
|
20 | - self::STREAMER_TYPE => "SyncRigtsManagementTemplate", |
|
21 | - self::STREAMER_ARRAY => SYNC_RIGHTSMANAGEMENT_TEMPLATE, |
|
22 | - self::STREAMER_PROP => self::STREAMER_TYPE_SEND_EMPTY, |
|
23 | - ], |
|
24 | - SYNC_SETTINGS_PROP_STATUS => [ |
|
25 | - self::STREAMER_VAR => "Status", |
|
26 | - self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE, |
|
27 | - ], |
|
28 | - ]; |
|
16 | + public function __construct() { |
|
17 | + $mapping = [ |
|
18 | + SYNC_RIGHTSMANAGEMENT_TEMPLATES => [ |
|
19 | + self::STREAMER_VAR => "rmtemplates", |
|
20 | + self::STREAMER_TYPE => "SyncRigtsManagementTemplate", |
|
21 | + self::STREAMER_ARRAY => SYNC_RIGHTSMANAGEMENT_TEMPLATE, |
|
22 | + self::STREAMER_PROP => self::STREAMER_TYPE_SEND_EMPTY, |
|
23 | + ], |
|
24 | + SYNC_SETTINGS_PROP_STATUS => [ |
|
25 | + self::STREAMER_VAR => "Status", |
|
26 | + self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE, |
|
27 | + ], |
|
28 | + ]; |
|
29 | 29 | |
30 | - parent::__construct($mapping); |
|
31 | - } |
|
30 | + parent::__construct($mapping); |
|
31 | + } |
|
32 | 32 | } |
@@ -10,84 +10,84 @@ |
||
10 | 10 | */ |
11 | 11 | |
12 | 12 | class SyncMailFlags extends SyncObject { |
13 | - public $subject; |
|
14 | - public $flagstatus; |
|
15 | - public $flagtype; // Possible types are clear, complete, active |
|
16 | - public $datecompleted; |
|
17 | - public $completetime; |
|
18 | - public $startdate; |
|
19 | - public $duedate; |
|
20 | - public $utcstartdate; |
|
21 | - public $utcduedate; |
|
22 | - public $reminderset; |
|
23 | - public $remindertime; |
|
24 | - public $ordinaldate; |
|
25 | - public $subordinaldate; |
|
13 | + public $subject; |
|
14 | + public $flagstatus; |
|
15 | + public $flagtype; // Possible types are clear, complete, active |
|
16 | + public $datecompleted; |
|
17 | + public $completetime; |
|
18 | + public $startdate; |
|
19 | + public $duedate; |
|
20 | + public $utcstartdate; |
|
21 | + public $utcduedate; |
|
22 | + public $reminderset; |
|
23 | + public $remindertime; |
|
24 | + public $ordinaldate; |
|
25 | + public $subordinaldate; |
|
26 | 26 | |
27 | - public function __construct() { |
|
28 | - $mapping = [ |
|
29 | - SYNC_POOMTASKS_SUBJECT => [ |
|
30 | - self::STREAMER_VAR => "subject", |
|
31 | - self::STREAMER_RONOTIFY => true, |
|
32 | - ], |
|
33 | - SYNC_POOMMAIL_FLAGSTATUS => [ |
|
34 | - self::STREAMER_VAR => "flagstatus", |
|
35 | - self::STREAMER_RONOTIFY => true, |
|
36 | - ], |
|
37 | - SYNC_POOMMAIL_FLAGTYPE => [ |
|
38 | - self::STREAMER_VAR => "flagtype", |
|
39 | - self::STREAMER_RONOTIFY => true, |
|
40 | - ], |
|
41 | - SYNC_POOMTASKS_DATECOMPLETED => [ |
|
42 | - self::STREAMER_VAR => "datecompleted", |
|
43 | - self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
44 | - self::STREAMER_RONOTIFY => true, |
|
45 | - ], |
|
46 | - SYNC_POOMMAIL_COMPLETETIME => [ |
|
47 | - self::STREAMER_VAR => "completetime", |
|
48 | - self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
49 | - self::STREAMER_RONOTIFY => true, |
|
50 | - ], |
|
51 | - SYNC_POOMTASKS_STARTDATE => [ |
|
52 | - self::STREAMER_VAR => "startdate", |
|
53 | - self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
54 | - self::STREAMER_RONOTIFY => true, |
|
55 | - ], |
|
56 | - SYNC_POOMTASKS_DUEDATE => [ |
|
57 | - self::STREAMER_VAR => "duedate", |
|
58 | - self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
59 | - self::STREAMER_RONOTIFY => true, |
|
60 | - ], |
|
61 | - SYNC_POOMTASKS_UTCSTARTDATE => [ |
|
62 | - self::STREAMER_VAR => "utcstartdate", |
|
63 | - self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
64 | - self::STREAMER_RONOTIFY => true, |
|
65 | - ], |
|
66 | - SYNC_POOMTASKS_UTCDUEDATE => [ |
|
67 | - self::STREAMER_VAR => "utcduedate", |
|
68 | - self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
69 | - self::STREAMER_RONOTIFY => true, |
|
70 | - ], |
|
71 | - SYNC_POOMTASKS_REMINDERSET => [ |
|
72 | - self::STREAMER_VAR => "reminderset", |
|
73 | - self::STREAMER_RONOTIFY => true, |
|
74 | - ], |
|
75 | - SYNC_POOMTASKS_REMINDERTIME => [ |
|
76 | - self::STREAMER_VAR => "remindertime", |
|
77 | - self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
78 | - self::STREAMER_RONOTIFY => true, |
|
79 | - ], |
|
80 | - SYNC_POOMTASKS_ORDINALDATE => [ |
|
81 | - self::STREAMER_VAR => "ordinaldate", |
|
82 | - self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
83 | - self::STREAMER_RONOTIFY => true, |
|
84 | - ], |
|
85 | - SYNC_POOMTASKS_SUBORDINALDATE => [ |
|
86 | - self::STREAMER_VAR => "subordinaldate", |
|
87 | - self::STREAMER_RONOTIFY => true, |
|
88 | - ], |
|
89 | - ]; |
|
27 | + public function __construct() { |
|
28 | + $mapping = [ |
|
29 | + SYNC_POOMTASKS_SUBJECT => [ |
|
30 | + self::STREAMER_VAR => "subject", |
|
31 | + self::STREAMER_RONOTIFY => true, |
|
32 | + ], |
|
33 | + SYNC_POOMMAIL_FLAGSTATUS => [ |
|
34 | + self::STREAMER_VAR => "flagstatus", |
|
35 | + self::STREAMER_RONOTIFY => true, |
|
36 | + ], |
|
37 | + SYNC_POOMMAIL_FLAGTYPE => [ |
|
38 | + self::STREAMER_VAR => "flagtype", |
|
39 | + self::STREAMER_RONOTIFY => true, |
|
40 | + ], |
|
41 | + SYNC_POOMTASKS_DATECOMPLETED => [ |
|
42 | + self::STREAMER_VAR => "datecompleted", |
|
43 | + self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
44 | + self::STREAMER_RONOTIFY => true, |
|
45 | + ], |
|
46 | + SYNC_POOMMAIL_COMPLETETIME => [ |
|
47 | + self::STREAMER_VAR => "completetime", |
|
48 | + self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
49 | + self::STREAMER_RONOTIFY => true, |
|
50 | + ], |
|
51 | + SYNC_POOMTASKS_STARTDATE => [ |
|
52 | + self::STREAMER_VAR => "startdate", |
|
53 | + self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
54 | + self::STREAMER_RONOTIFY => true, |
|
55 | + ], |
|
56 | + SYNC_POOMTASKS_DUEDATE => [ |
|
57 | + self::STREAMER_VAR => "duedate", |
|
58 | + self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
59 | + self::STREAMER_RONOTIFY => true, |
|
60 | + ], |
|
61 | + SYNC_POOMTASKS_UTCSTARTDATE => [ |
|
62 | + self::STREAMER_VAR => "utcstartdate", |
|
63 | + self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
64 | + self::STREAMER_RONOTIFY => true, |
|
65 | + ], |
|
66 | + SYNC_POOMTASKS_UTCDUEDATE => [ |
|
67 | + self::STREAMER_VAR => "utcduedate", |
|
68 | + self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
69 | + self::STREAMER_RONOTIFY => true, |
|
70 | + ], |
|
71 | + SYNC_POOMTASKS_REMINDERSET => [ |
|
72 | + self::STREAMER_VAR => "reminderset", |
|
73 | + self::STREAMER_RONOTIFY => true, |
|
74 | + ], |
|
75 | + SYNC_POOMTASKS_REMINDERTIME => [ |
|
76 | + self::STREAMER_VAR => "remindertime", |
|
77 | + self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
78 | + self::STREAMER_RONOTIFY => true, |
|
79 | + ], |
|
80 | + SYNC_POOMTASKS_ORDINALDATE => [ |
|
81 | + self::STREAMER_VAR => "ordinaldate", |
|
82 | + self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, |
|
83 | + self::STREAMER_RONOTIFY => true, |
|
84 | + ], |
|
85 | + SYNC_POOMTASKS_SUBORDINALDATE => [ |
|
86 | + self::STREAMER_VAR => "subordinaldate", |
|
87 | + self::STREAMER_RONOTIFY => true, |
|
88 | + ], |
|
89 | + ]; |
|
90 | 90 | |
91 | - parent::__construct($mapping); |
|
92 | - } |
|
91 | + parent::__construct($mapping); |
|
92 | + } |
|
93 | 93 | } |
@@ -10,42 +10,42 @@ |
||
10 | 10 | */ |
11 | 11 | |
12 | 12 | class SyncSendMail extends SyncObject { |
13 | - public $clientid; |
|
14 | - public $saveinsent; |
|
15 | - public $replacemime; |
|
16 | - public $accountid; |
|
17 | - public $source; |
|
18 | - public $mime; |
|
19 | - public $replyflag; |
|
20 | - public $forwardflag; |
|
13 | + public $clientid; |
|
14 | + public $saveinsent; |
|
15 | + public $replacemime; |
|
16 | + public $accountid; |
|
17 | + public $source; |
|
18 | + public $mime; |
|
19 | + public $replyflag; |
|
20 | + public $forwardflag; |
|
21 | 21 | |
22 | - public function __construct() { |
|
23 | - $mapping = [ |
|
24 | - SYNC_COMPOSEMAIL_CLIENTID => [self::STREAMER_VAR => "clientid"], |
|
25 | - SYNC_COMPOSEMAIL_SAVEINSENTITEMS => [ |
|
26 | - self::STREAMER_VAR => "saveinsent", |
|
27 | - self::STREAMER_PROP => self::STREAMER_TYPE_SEND_EMPTY, |
|
28 | - ], |
|
29 | - SYNC_COMPOSEMAIL_REPLACEMIME => [ |
|
30 | - self::STREAMER_VAR => "replacemime", |
|
31 | - self::STREAMER_PROP => self::STREAMER_TYPE_SEND_EMPTY, |
|
32 | - ], |
|
33 | - SYNC_COMPOSEMAIL_ACCOUNTID => [self::STREAMER_VAR => "accountid"], |
|
34 | - SYNC_COMPOSEMAIL_SOURCE => [ |
|
35 | - self::STREAMER_VAR => "source", |
|
36 | - self::STREAMER_TYPE => "SyncSendMailSource", |
|
37 | - ], |
|
38 | - SYNC_COMPOSEMAIL_MIME => [self::STREAMER_VAR => "mime"], |
|
39 | - SYNC_COMPOSEMAIL_REPLYFLAG => [ |
|
40 | - self::STREAMER_VAR => "replyflag", |
|
41 | - self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE, |
|
42 | - ], |
|
43 | - SYNC_COMPOSEMAIL_FORWARDFLAG => [ |
|
44 | - self::STREAMER_VAR => "forwardflag", |
|
45 | - self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE, |
|
46 | - ], |
|
47 | - ]; |
|
22 | + public function __construct() { |
|
23 | + $mapping = [ |
|
24 | + SYNC_COMPOSEMAIL_CLIENTID => [self::STREAMER_VAR => "clientid"], |
|
25 | + SYNC_COMPOSEMAIL_SAVEINSENTITEMS => [ |
|
26 | + self::STREAMER_VAR => "saveinsent", |
|
27 | + self::STREAMER_PROP => self::STREAMER_TYPE_SEND_EMPTY, |
|
28 | + ], |
|
29 | + SYNC_COMPOSEMAIL_REPLACEMIME => [ |
|
30 | + self::STREAMER_VAR => "replacemime", |
|
31 | + self::STREAMER_PROP => self::STREAMER_TYPE_SEND_EMPTY, |
|
32 | + ], |
|
33 | + SYNC_COMPOSEMAIL_ACCOUNTID => [self::STREAMER_VAR => "accountid"], |
|
34 | + SYNC_COMPOSEMAIL_SOURCE => [ |
|
35 | + self::STREAMER_VAR => "source", |
|
36 | + self::STREAMER_TYPE => "SyncSendMailSource", |
|
37 | + ], |
|
38 | + SYNC_COMPOSEMAIL_MIME => [self::STREAMER_VAR => "mime"], |
|
39 | + SYNC_COMPOSEMAIL_REPLYFLAG => [ |
|
40 | + self::STREAMER_VAR => "replyflag", |
|
41 | + self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE, |
|
42 | + ], |
|
43 | + SYNC_COMPOSEMAIL_FORWARDFLAG => [ |
|
44 | + self::STREAMER_VAR => "forwardflag", |
|
45 | + self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE, |
|
46 | + ], |
|
47 | + ]; |
|
48 | 48 | |
49 | - parent::__construct($mapping); |
|
50 | - } |
|
49 | + parent::__construct($mapping); |
|
50 | + } |
|
51 | 51 | } |
@@ -8,452 +8,452 @@ |
||
8 | 8 | * MAPI to AS mapping class. |
9 | 9 | */ |
10 | 10 | class MAPIMapping { |
11 | - /** |
|
12 | - * Returns the MAPI to AS mapping for contacts. |
|
13 | - * |
|
14 | - * @return array |
|
15 | - */ |
|
16 | - public static function GetContactMapping() { |
|
17 | - return [ |
|
18 | - "anniversary" => PR_WEDDING_ANNIVERSARY, |
|
19 | - "assistantname" => PR_ASSISTANT, |
|
20 | - "assistnamephonenumber" => PR_ASSISTANT_TELEPHONE_NUMBER, |
|
21 | - "birthday" => PR_BIRTHDAY, |
|
22 | - "body" => PR_BODY, |
|
23 | - "business2phonenumber" => PR_BUSINESS2_TELEPHONE_NUMBER, |
|
24 | - "businesscity" => "PT_STRING8:PSETID_Address:0x8046", |
|
25 | - "businesscountry" => "PT_STRING8:PSETID_Address:0x8049", |
|
26 | - "businesspostalcode" => "PT_STRING8:PSETID_Address:0x8048", |
|
27 | - "businessstate" => "PT_STRING8:PSETID_Address:0x8047", |
|
28 | - "businessstreet" => "PT_STRING8:PSETID_Address:0x8045", |
|
29 | - "businessfaxnumber" => PR_BUSINESS_FAX_NUMBER, |
|
30 | - "businessphonenumber" => PR_OFFICE_TELEPHONE_NUMBER, |
|
31 | - "carphonenumber" => PR_CAR_TELEPHONE_NUMBER, |
|
32 | - "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
33 | - "children" => PR_CHILDRENS_NAMES, |
|
34 | - "companyname" => PR_COMPANY_NAME, |
|
35 | - "department" => PR_DEPARTMENT_NAME, |
|
36 | - "email1address" => "PT_STRING8:PSETID_Address:0x8083", |
|
37 | - "email2address" => "PT_STRING8:PSETID_Address:0x8093", |
|
38 | - "email3address" => "PT_STRING8:PSETID_Address:0x80A3", |
|
39 | - "fileas" => "PT_STRING8:PSETID_Address:0x8005", |
|
40 | - "firstname" => PR_GIVEN_NAME, |
|
41 | - "home2phonenumber" => PR_HOME2_TELEPHONE_NUMBER, |
|
42 | - "homecity" => PR_HOME_ADDRESS_CITY, |
|
43 | - "homecountry" => PR_HOME_ADDRESS_COUNTRY, |
|
44 | - "homepostalcode" => PR_HOME_ADDRESS_POSTAL_CODE, |
|
45 | - "homestate" => PR_HOME_ADDRESS_STATE_OR_PROVINCE, |
|
46 | - "homestreet" => PR_HOME_ADDRESS_STREET, |
|
47 | - "homefaxnumber" => PR_HOME_FAX_NUMBER, |
|
48 | - "homephonenumber" => PR_HOME_TELEPHONE_NUMBER, |
|
49 | - "jobtitle" => PR_TITLE, |
|
50 | - "lastname" => PR_SURNAME, |
|
51 | - "middlename" => PR_MIDDLE_NAME, |
|
52 | - "mobilephonenumber" => PR_CELLULAR_TELEPHONE_NUMBER, |
|
53 | - "officelocation" => PR_OFFICE_LOCATION, |
|
54 | - "othercity" => PR_OTHER_ADDRESS_CITY, |
|
55 | - "othercountry" => PR_OTHER_ADDRESS_COUNTRY, |
|
56 | - "otherpostalcode" => PR_OTHER_ADDRESS_POSTAL_CODE, |
|
57 | - "otherstate" => PR_OTHER_ADDRESS_STATE_OR_PROVINCE, |
|
58 | - "otherstreet" => PR_OTHER_ADDRESS_STREET, |
|
59 | - "pagernumber" => PR_PAGER_TELEPHONE_NUMBER, |
|
60 | - "radiophonenumber" => PR_RADIO_TELEPHONE_NUMBER, |
|
61 | - "spouse" => PR_SPOUSE_NAME, |
|
62 | - "suffix" => PR_GENERATION, |
|
63 | - "title" => PR_DISPLAY_NAME_PREFIX, |
|
64 | - "webpage" => "PT_STRING8:PSETID_Address:0x802b", |
|
65 | - "yomicompanyname" => "PT_STRING8:PSETID_Address:0x802e", |
|
66 | - "yomifirstname" => "PT_STRING8:PSETID_Address:0x802c", |
|
67 | - "yomilastname" => "PT_STRING8:PSETID_Address:0x802d", |
|
68 | - "rtf" => PR_RTF_COMPRESSED, |
|
69 | - // picture |
|
70 | - "customerid" => PR_CUSTOMER_ID, |
|
71 | - "governmentid" => PR_GOVERNMENT_ID_NUMBER, |
|
72 | - "imaddress" => "PT_STRING8:PSETID_Address:0x8062", |
|
73 | - "imaddress2" => "PT_STRING8:PSETID_AirSync:IMAddress2", |
|
74 | - "imaddress3" => "PT_STRING8:PSETID_AirSync:IMAddress3", |
|
75 | - "managername" => PR_MANAGER_NAME, |
|
76 | - "companymainphone" => PR_COMPANY_MAIN_PHONE_NUMBER, |
|
77 | - "accountname" => PR_ACCOUNT, |
|
78 | - "nickname" => PR_NICKNAME, |
|
79 | - // mms |
|
80 | - ]; |
|
81 | - } |
|
11 | + /** |
|
12 | + * Returns the MAPI to AS mapping for contacts. |
|
13 | + * |
|
14 | + * @return array |
|
15 | + */ |
|
16 | + public static function GetContactMapping() { |
|
17 | + return [ |
|
18 | + "anniversary" => PR_WEDDING_ANNIVERSARY, |
|
19 | + "assistantname" => PR_ASSISTANT, |
|
20 | + "assistnamephonenumber" => PR_ASSISTANT_TELEPHONE_NUMBER, |
|
21 | + "birthday" => PR_BIRTHDAY, |
|
22 | + "body" => PR_BODY, |
|
23 | + "business2phonenumber" => PR_BUSINESS2_TELEPHONE_NUMBER, |
|
24 | + "businesscity" => "PT_STRING8:PSETID_Address:0x8046", |
|
25 | + "businesscountry" => "PT_STRING8:PSETID_Address:0x8049", |
|
26 | + "businesspostalcode" => "PT_STRING8:PSETID_Address:0x8048", |
|
27 | + "businessstate" => "PT_STRING8:PSETID_Address:0x8047", |
|
28 | + "businessstreet" => "PT_STRING8:PSETID_Address:0x8045", |
|
29 | + "businessfaxnumber" => PR_BUSINESS_FAX_NUMBER, |
|
30 | + "businessphonenumber" => PR_OFFICE_TELEPHONE_NUMBER, |
|
31 | + "carphonenumber" => PR_CAR_TELEPHONE_NUMBER, |
|
32 | + "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
33 | + "children" => PR_CHILDRENS_NAMES, |
|
34 | + "companyname" => PR_COMPANY_NAME, |
|
35 | + "department" => PR_DEPARTMENT_NAME, |
|
36 | + "email1address" => "PT_STRING8:PSETID_Address:0x8083", |
|
37 | + "email2address" => "PT_STRING8:PSETID_Address:0x8093", |
|
38 | + "email3address" => "PT_STRING8:PSETID_Address:0x80A3", |
|
39 | + "fileas" => "PT_STRING8:PSETID_Address:0x8005", |
|
40 | + "firstname" => PR_GIVEN_NAME, |
|
41 | + "home2phonenumber" => PR_HOME2_TELEPHONE_NUMBER, |
|
42 | + "homecity" => PR_HOME_ADDRESS_CITY, |
|
43 | + "homecountry" => PR_HOME_ADDRESS_COUNTRY, |
|
44 | + "homepostalcode" => PR_HOME_ADDRESS_POSTAL_CODE, |
|
45 | + "homestate" => PR_HOME_ADDRESS_STATE_OR_PROVINCE, |
|
46 | + "homestreet" => PR_HOME_ADDRESS_STREET, |
|
47 | + "homefaxnumber" => PR_HOME_FAX_NUMBER, |
|
48 | + "homephonenumber" => PR_HOME_TELEPHONE_NUMBER, |
|
49 | + "jobtitle" => PR_TITLE, |
|
50 | + "lastname" => PR_SURNAME, |
|
51 | + "middlename" => PR_MIDDLE_NAME, |
|
52 | + "mobilephonenumber" => PR_CELLULAR_TELEPHONE_NUMBER, |
|
53 | + "officelocation" => PR_OFFICE_LOCATION, |
|
54 | + "othercity" => PR_OTHER_ADDRESS_CITY, |
|
55 | + "othercountry" => PR_OTHER_ADDRESS_COUNTRY, |
|
56 | + "otherpostalcode" => PR_OTHER_ADDRESS_POSTAL_CODE, |
|
57 | + "otherstate" => PR_OTHER_ADDRESS_STATE_OR_PROVINCE, |
|
58 | + "otherstreet" => PR_OTHER_ADDRESS_STREET, |
|
59 | + "pagernumber" => PR_PAGER_TELEPHONE_NUMBER, |
|
60 | + "radiophonenumber" => PR_RADIO_TELEPHONE_NUMBER, |
|
61 | + "spouse" => PR_SPOUSE_NAME, |
|
62 | + "suffix" => PR_GENERATION, |
|
63 | + "title" => PR_DISPLAY_NAME_PREFIX, |
|
64 | + "webpage" => "PT_STRING8:PSETID_Address:0x802b", |
|
65 | + "yomicompanyname" => "PT_STRING8:PSETID_Address:0x802e", |
|
66 | + "yomifirstname" => "PT_STRING8:PSETID_Address:0x802c", |
|
67 | + "yomilastname" => "PT_STRING8:PSETID_Address:0x802d", |
|
68 | + "rtf" => PR_RTF_COMPRESSED, |
|
69 | + // picture |
|
70 | + "customerid" => PR_CUSTOMER_ID, |
|
71 | + "governmentid" => PR_GOVERNMENT_ID_NUMBER, |
|
72 | + "imaddress" => "PT_STRING8:PSETID_Address:0x8062", |
|
73 | + "imaddress2" => "PT_STRING8:PSETID_AirSync:IMAddress2", |
|
74 | + "imaddress3" => "PT_STRING8:PSETID_AirSync:IMAddress3", |
|
75 | + "managername" => PR_MANAGER_NAME, |
|
76 | + "companymainphone" => PR_COMPANY_MAIN_PHONE_NUMBER, |
|
77 | + "accountname" => PR_ACCOUNT, |
|
78 | + "nickname" => PR_NICKNAME, |
|
79 | + // mms |
|
80 | + ]; |
|
81 | + } |
|
82 | 82 | |
83 | - /** |
|
84 | - * Returns contact specific MAPI properties. |
|
85 | - * |
|
86 | - * @return array |
|
87 | - */ |
|
88 | - public static function GetContactProperties() { |
|
89 | - return [ |
|
90 | - "haspic" => "PT_BOOLEAN:PSETID_Address:0x8015", |
|
91 | - "emailaddress1" => "PT_STRING8:PSETID_Address:0x8083", |
|
92 | - "emailaddressdname1" => "PT_STRING8:PSETID_Address:0x8080", |
|
93 | - "emailaddressdemail1" => "PT_STRING8:PSETID_Address:0x8084", |
|
94 | - "emailaddresstype1" => "PT_STRING8:PSETID_Address:0x8082", |
|
95 | - "emailaddressentryid1" => "PT_BINARY:PSETID_Address:0x8085", |
|
96 | - "emailaddress2" => "PT_STRING8:PSETID_Address:0x8093", |
|
97 | - "emailaddressdname2" => "PT_STRING8:PSETID_Address:0x8090", |
|
98 | - "emailaddressdemail2" => "PT_STRING8:PSETID_Address:0x8094", |
|
99 | - "emailaddresstype2" => "PT_STRING8:PSETID_Address:0x8092", |
|
100 | - "emailaddressentryid2" => "PT_BINARY:PSETID_Address:0x8095", |
|
101 | - "emailaddress3" => "PT_STRING8:PSETID_Address:0x80a3", |
|
102 | - "emailaddressdname3" => "PT_STRING8:PSETID_Address:0x80a0", |
|
103 | - "emailaddressdemail3" => "PT_STRING8:PSETID_Address:0x80a4", |
|
104 | - "emailaddresstype3" => "PT_STRING8:PSETID_Address:0x80a2", |
|
105 | - "emailaddressentryid3" => "PT_BINARY:PSETID_Address:0x80a5", |
|
106 | - "addressbookmv" => "PT_MV_LONG:PSETID_Address:0x8028", |
|
107 | - "addressbooklong" => "PT_LONG:PSETID_Address:0x8029", |
|
108 | - "displayname" => PR_DISPLAY_NAME, |
|
109 | - "subject" => PR_SUBJECT, |
|
110 | - "country" => PR_COUNTRY, |
|
111 | - "city" => PR_LOCALITY, |
|
112 | - "postaladdress" => PR_POSTAL_ADDRESS, |
|
113 | - "postalcode" => PR_POSTAL_CODE, |
|
114 | - "state" => PR_STATE_OR_PROVINCE, |
|
115 | - "street" => PR_STREET_ADDRESS, |
|
116 | - "homeaddress" => "PT_STRING8:PSETID_Address:0x801a", |
|
117 | - "businessaddress" => "PT_STRING8:PSETID_Address:0x801b", |
|
118 | - "otheraddress" => "PT_STRING8:PSETID_Address:0x801c", |
|
119 | - "mailingaddress" => "PT_LONG:PSETID_Address:0x8022", |
|
120 | - ]; |
|
121 | - } |
|
83 | + /** |
|
84 | + * Returns contact specific MAPI properties. |
|
85 | + * |
|
86 | + * @return array |
|
87 | + */ |
|
88 | + public static function GetContactProperties() { |
|
89 | + return [ |
|
90 | + "haspic" => "PT_BOOLEAN:PSETID_Address:0x8015", |
|
91 | + "emailaddress1" => "PT_STRING8:PSETID_Address:0x8083", |
|
92 | + "emailaddressdname1" => "PT_STRING8:PSETID_Address:0x8080", |
|
93 | + "emailaddressdemail1" => "PT_STRING8:PSETID_Address:0x8084", |
|
94 | + "emailaddresstype1" => "PT_STRING8:PSETID_Address:0x8082", |
|
95 | + "emailaddressentryid1" => "PT_BINARY:PSETID_Address:0x8085", |
|
96 | + "emailaddress2" => "PT_STRING8:PSETID_Address:0x8093", |
|
97 | + "emailaddressdname2" => "PT_STRING8:PSETID_Address:0x8090", |
|
98 | + "emailaddressdemail2" => "PT_STRING8:PSETID_Address:0x8094", |
|
99 | + "emailaddresstype2" => "PT_STRING8:PSETID_Address:0x8092", |
|
100 | + "emailaddressentryid2" => "PT_BINARY:PSETID_Address:0x8095", |
|
101 | + "emailaddress3" => "PT_STRING8:PSETID_Address:0x80a3", |
|
102 | + "emailaddressdname3" => "PT_STRING8:PSETID_Address:0x80a0", |
|
103 | + "emailaddressdemail3" => "PT_STRING8:PSETID_Address:0x80a4", |
|
104 | + "emailaddresstype3" => "PT_STRING8:PSETID_Address:0x80a2", |
|
105 | + "emailaddressentryid3" => "PT_BINARY:PSETID_Address:0x80a5", |
|
106 | + "addressbookmv" => "PT_MV_LONG:PSETID_Address:0x8028", |
|
107 | + "addressbooklong" => "PT_LONG:PSETID_Address:0x8029", |
|
108 | + "displayname" => PR_DISPLAY_NAME, |
|
109 | + "subject" => PR_SUBJECT, |
|
110 | + "country" => PR_COUNTRY, |
|
111 | + "city" => PR_LOCALITY, |
|
112 | + "postaladdress" => PR_POSTAL_ADDRESS, |
|
113 | + "postalcode" => PR_POSTAL_CODE, |
|
114 | + "state" => PR_STATE_OR_PROVINCE, |
|
115 | + "street" => PR_STREET_ADDRESS, |
|
116 | + "homeaddress" => "PT_STRING8:PSETID_Address:0x801a", |
|
117 | + "businessaddress" => "PT_STRING8:PSETID_Address:0x801b", |
|
118 | + "otheraddress" => "PT_STRING8:PSETID_Address:0x801c", |
|
119 | + "mailingaddress" => "PT_LONG:PSETID_Address:0x8022", |
|
120 | + ]; |
|
121 | + } |
|
122 | 122 | |
123 | - /** |
|
124 | - * Returns the MAPI to AS mapping for emails. |
|
125 | - * |
|
126 | - * @return array |
|
127 | - */ |
|
128 | - public static function GetEmailMapping() { |
|
129 | - return [ |
|
130 | - // from |
|
131 | - "datereceived" => PR_MESSAGE_DELIVERY_TIME, |
|
132 | - "displayname" => PR_SUBJECT, |
|
133 | - "displayto" => PR_DISPLAY_TO, |
|
134 | - "importance" => PR_IMPORTANCE, |
|
135 | - "messageclass" => PR_MESSAGE_CLASS, |
|
136 | - "subject" => PR_SUBJECT, |
|
137 | - "read" => PR_MESSAGE_FLAGS, |
|
138 | - // "to" // need to be generated with SMTP addresses |
|
139 | - // "cc" |
|
140 | - // "threadtopic" => PR_CONVERSATION_TOPIC, |
|
141 | - "internetcpid" => PR_INTERNET_CPID, |
|
142 | - "nativebodytype" => PR_NATIVE_BODY_INFO, |
|
143 | - "lastverbexecuted" => PR_LAST_VERB_EXECUTED, |
|
144 | - "lastverbexectime" => PR_LAST_VERB_EXECUTION_TIME, |
|
145 | - "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
146 | - ]; |
|
147 | - } |
|
123 | + /** |
|
124 | + * Returns the MAPI to AS mapping for emails. |
|
125 | + * |
|
126 | + * @return array |
|
127 | + */ |
|
128 | + public static function GetEmailMapping() { |
|
129 | + return [ |
|
130 | + // from |
|
131 | + "datereceived" => PR_MESSAGE_DELIVERY_TIME, |
|
132 | + "displayname" => PR_SUBJECT, |
|
133 | + "displayto" => PR_DISPLAY_TO, |
|
134 | + "importance" => PR_IMPORTANCE, |
|
135 | + "messageclass" => PR_MESSAGE_CLASS, |
|
136 | + "subject" => PR_SUBJECT, |
|
137 | + "read" => PR_MESSAGE_FLAGS, |
|
138 | + // "to" // need to be generated with SMTP addresses |
|
139 | + // "cc" |
|
140 | + // "threadtopic" => PR_CONVERSATION_TOPIC, |
|
141 | + "internetcpid" => PR_INTERNET_CPID, |
|
142 | + "nativebodytype" => PR_NATIVE_BODY_INFO, |
|
143 | + "lastverbexecuted" => PR_LAST_VERB_EXECUTED, |
|
144 | + "lastverbexectime" => PR_LAST_VERB_EXECUTION_TIME, |
|
145 | + "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
146 | + ]; |
|
147 | + } |
|
148 | 148 | |
149 | - /** |
|
150 | - * Returns email specific MAPI properties. |
|
151 | - * |
|
152 | - * @return array |
|
153 | - */ |
|
154 | - public static function GetEmailProperties() { |
|
155 | - return [ |
|
156 | - // Override 'From' to show "Full Name <[email protected]>" |
|
157 | - "representingname" => PR_SENT_REPRESENTING_NAME, |
|
158 | - "representingentryid" => PR_SENT_REPRESENTING_ENTRYID, |
|
159 | - "representingsearchkey" => PR_SENT_REPRESENTING_SEARCH_KEY, |
|
160 | - "sourcekey" => PR_SOURCE_KEY, |
|
161 | - "entryid" => PR_ENTRYID, |
|
162 | - "parentsourcekey" => PR_PARENT_SOURCE_KEY, |
|
163 | - "body" => PR_BODY, |
|
164 | - "rtfcompressed" => PR_RTF_COMPRESSED, |
|
165 | - "html" => PR_HTML, |
|
166 | - "rtfinsync" => PR_RTF_IN_SYNC, |
|
167 | - "processed" => PR_PROCESSED, |
|
168 | - ]; |
|
169 | - } |
|
149 | + /** |
|
150 | + * Returns email specific MAPI properties. |
|
151 | + * |
|
152 | + * @return array |
|
153 | + */ |
|
154 | + public static function GetEmailProperties() { |
|
155 | + return [ |
|
156 | + // Override 'From' to show "Full Name <[email protected]>" |
|
157 | + "representingname" => PR_SENT_REPRESENTING_NAME, |
|
158 | + "representingentryid" => PR_SENT_REPRESENTING_ENTRYID, |
|
159 | + "representingsearchkey" => PR_SENT_REPRESENTING_SEARCH_KEY, |
|
160 | + "sourcekey" => PR_SOURCE_KEY, |
|
161 | + "entryid" => PR_ENTRYID, |
|
162 | + "parentsourcekey" => PR_PARENT_SOURCE_KEY, |
|
163 | + "body" => PR_BODY, |
|
164 | + "rtfcompressed" => PR_RTF_COMPRESSED, |
|
165 | + "html" => PR_HTML, |
|
166 | + "rtfinsync" => PR_RTF_IN_SYNC, |
|
167 | + "processed" => PR_PROCESSED, |
|
168 | + ]; |
|
169 | + } |
|
170 | 170 | |
171 | - /** |
|
172 | - * Returns the MAPI to AS mapping for meeting requests. |
|
173 | - * |
|
174 | - * @return array |
|
175 | - */ |
|
176 | - public static function GetMeetingRequestMapping() { |
|
177 | - return [ |
|
178 | - "responserequested" => PR_RESPONSE_REQUESTED, |
|
179 | - // timezone |
|
180 | - "alldayevent" => "PT_BOOLEAN:PSETID_Appointment:0x8215", |
|
181 | - "busystatus" => "PT_LONG:PSETID_Appointment:0x8224", |
|
182 | - "rtf" => PR_RTF_COMPRESSED, |
|
183 | - "dtstamp" => PR_LAST_MODIFICATION_TIME, |
|
184 | - "endtime" => "PT_SYSTIME:PSETID_Appointment:0x820e", |
|
185 | - "location" => "PT_STRING8:PSETID_Appointment:0x8208", |
|
186 | - // recurrences |
|
187 | - "reminder" => "PT_LONG:PSETID_Common:0x8501", |
|
188 | - "starttime" => "PT_SYSTIME:PSETID_Appointment:0x820d", |
|
189 | - "sensitivity" => PR_SENSITIVITY, |
|
190 | - ]; |
|
191 | - } |
|
171 | + /** |
|
172 | + * Returns the MAPI to AS mapping for meeting requests. |
|
173 | + * |
|
174 | + * @return array |
|
175 | + */ |
|
176 | + public static function GetMeetingRequestMapping() { |
|
177 | + return [ |
|
178 | + "responserequested" => PR_RESPONSE_REQUESTED, |
|
179 | + // timezone |
|
180 | + "alldayevent" => "PT_BOOLEAN:PSETID_Appointment:0x8215", |
|
181 | + "busystatus" => "PT_LONG:PSETID_Appointment:0x8224", |
|
182 | + "rtf" => PR_RTF_COMPRESSED, |
|
183 | + "dtstamp" => PR_LAST_MODIFICATION_TIME, |
|
184 | + "endtime" => "PT_SYSTIME:PSETID_Appointment:0x820e", |
|
185 | + "location" => "PT_STRING8:PSETID_Appointment:0x8208", |
|
186 | + // recurrences |
|
187 | + "reminder" => "PT_LONG:PSETID_Common:0x8501", |
|
188 | + "starttime" => "PT_SYSTIME:PSETID_Appointment:0x820d", |
|
189 | + "sensitivity" => PR_SENSITIVITY, |
|
190 | + ]; |
|
191 | + } |
|
192 | 192 | |
193 | - public static function GetMeetingRequestProperties() { |
|
194 | - return [ |
|
195 | - "goidtag" => "PT_BINARY:PSETID_Meeting:0x3", |
|
196 | - "timezonetag" => "PT_BINARY:PSETID_Appointment:0x8233", |
|
197 | - "recReplTime" => "PT_SYSTIME:PSETID_Appointment:0x8228", |
|
198 | - "isrecurringtag" => "PT_BOOLEAN:PSETID_Appointment:0x8223", |
|
199 | - "recurringstate" => "PT_BINARY:PSETID_Appointment:0x8216", |
|
200 | - "appSeqNr" => "PT_LONG:PSETID_Appointment:0x8201", |
|
201 | - "lidIsException" => "PT_BOOLEAN:PSETID_Appointment:0xA", |
|
202 | - "recurStartTime" => "PT_LONG:PSETID_Meeting:0xE", |
|
203 | - "reminderset" => "PT_BOOLEAN:PSETID_Common:0x8503", |
|
204 | - "remindertime" => "PT_LONG:PSETID_Common:0x8501", |
|
205 | - "recurrenceend" => "PT_SYSTIME:PSETID_Appointment:0x8236", |
|
206 | - "meetingType" => "PT_LONG:PSETID_Meeting:0x26", |
|
207 | - ]; |
|
208 | - } |
|
193 | + public static function GetMeetingRequestProperties() { |
|
194 | + return [ |
|
195 | + "goidtag" => "PT_BINARY:PSETID_Meeting:0x3", |
|
196 | + "timezonetag" => "PT_BINARY:PSETID_Appointment:0x8233", |
|
197 | + "recReplTime" => "PT_SYSTIME:PSETID_Appointment:0x8228", |
|
198 | + "isrecurringtag" => "PT_BOOLEAN:PSETID_Appointment:0x8223", |
|
199 | + "recurringstate" => "PT_BINARY:PSETID_Appointment:0x8216", |
|
200 | + "appSeqNr" => "PT_LONG:PSETID_Appointment:0x8201", |
|
201 | + "lidIsException" => "PT_BOOLEAN:PSETID_Appointment:0xA", |
|
202 | + "recurStartTime" => "PT_LONG:PSETID_Meeting:0xE", |
|
203 | + "reminderset" => "PT_BOOLEAN:PSETID_Common:0x8503", |
|
204 | + "remindertime" => "PT_LONG:PSETID_Common:0x8501", |
|
205 | + "recurrenceend" => "PT_SYSTIME:PSETID_Appointment:0x8236", |
|
206 | + "meetingType" => "PT_LONG:PSETID_Meeting:0x26", |
|
207 | + ]; |
|
208 | + } |
|
209 | 209 | |
210 | - public static function GetTnefAndIcalProperties() { |
|
211 | - return [ |
|
212 | - "starttime" => "PT_SYSTIME:PSETID_Appointment:0x820d", |
|
213 | - "endtime" => "PT_SYSTIME:PSETID_Appointment:0x820e", |
|
214 | - "commonstart" => "PT_SYSTIME:PSETID_Common:0x8516", |
|
215 | - "commonend" => "PT_SYSTIME:PSETID_Common:0x8517", |
|
216 | - "clipstart" => "PT_SYSTIME:PSETID_Appointment:0x8235", // ical only |
|
217 | - "recurrenceend" => "PT_SYSTIME:PSETID_Appointment:0x8236", // ical only |
|
218 | - "isrecurringtag" => "PT_BOOLEAN:PSETID_Appointment:0x8223", |
|
219 | - "goidtag" => "PT_BINARY:PSETID_Meeting:0x3", |
|
220 | - "goid2tag" => "PT_BINARY:PSETID_Meeting:0x23", |
|
221 | - "usetnef" => "PT_LONG:PSETID_Meeting:0x8582", |
|
222 | - "tneflocation" => "PT_STRING8:PSETID_Meeting:0x2", // ical only |
|
223 | - "location" => "PT_STRING8:PSETID_Appointment:0x8208", |
|
224 | - "tnefrecurr" => "PT_BOOLEAN:PSETID_Meeting:0x5", |
|
225 | - "sideeffects" => "PT_LONG:PSETID_Common:0x8510", |
|
226 | - "type" => "PT_STRING8:PSETID_Meeting:0x24", |
|
227 | - "busystatus" => "PT_LONG:PSETID_Appointment:0x8205", |
|
228 | - "meetingstatus" => "PT_LONG:PSETID_Appointment:0x8217", |
|
229 | - "responsestatus" => "PT_LONG:PSETID_Meeting:0x8218", |
|
230 | - // the properties below are currently not used |
|
231 | - "dayinterval" => "PT_I2:PSETID_Meeting:0x11", |
|
232 | - "weekinterval" => "PT_I2:PSETID_Meeting:0x12", |
|
233 | - "monthinterval" => "PT_I2:PSETID_Meeting:0x13", |
|
234 | - "yearinterval" => "PT_I2:PSETID_Meeting:0x14", |
|
235 | - ]; |
|
236 | - } |
|
210 | + public static function GetTnefAndIcalProperties() { |
|
211 | + return [ |
|
212 | + "starttime" => "PT_SYSTIME:PSETID_Appointment:0x820d", |
|
213 | + "endtime" => "PT_SYSTIME:PSETID_Appointment:0x820e", |
|
214 | + "commonstart" => "PT_SYSTIME:PSETID_Common:0x8516", |
|
215 | + "commonend" => "PT_SYSTIME:PSETID_Common:0x8517", |
|
216 | + "clipstart" => "PT_SYSTIME:PSETID_Appointment:0x8235", // ical only |
|
217 | + "recurrenceend" => "PT_SYSTIME:PSETID_Appointment:0x8236", // ical only |
|
218 | + "isrecurringtag" => "PT_BOOLEAN:PSETID_Appointment:0x8223", |
|
219 | + "goidtag" => "PT_BINARY:PSETID_Meeting:0x3", |
|
220 | + "goid2tag" => "PT_BINARY:PSETID_Meeting:0x23", |
|
221 | + "usetnef" => "PT_LONG:PSETID_Meeting:0x8582", |
|
222 | + "tneflocation" => "PT_STRING8:PSETID_Meeting:0x2", // ical only |
|
223 | + "location" => "PT_STRING8:PSETID_Appointment:0x8208", |
|
224 | + "tnefrecurr" => "PT_BOOLEAN:PSETID_Meeting:0x5", |
|
225 | + "sideeffects" => "PT_LONG:PSETID_Common:0x8510", |
|
226 | + "type" => "PT_STRING8:PSETID_Meeting:0x24", |
|
227 | + "busystatus" => "PT_LONG:PSETID_Appointment:0x8205", |
|
228 | + "meetingstatus" => "PT_LONG:PSETID_Appointment:0x8217", |
|
229 | + "responsestatus" => "PT_LONG:PSETID_Meeting:0x8218", |
|
230 | + // the properties below are currently not used |
|
231 | + "dayinterval" => "PT_I2:PSETID_Meeting:0x11", |
|
232 | + "weekinterval" => "PT_I2:PSETID_Meeting:0x12", |
|
233 | + "monthinterval" => "PT_I2:PSETID_Meeting:0x13", |
|
234 | + "yearinterval" => "PT_I2:PSETID_Meeting:0x14", |
|
235 | + ]; |
|
236 | + } |
|
237 | 237 | |
238 | - /** |
|
239 | - * Returns the MAPI to AS mapping for appointments. |
|
240 | - * |
|
241 | - * @return array |
|
242 | - */ |
|
243 | - public static function GetAppointmentMapping() { |
|
244 | - return [ |
|
245 | - "alldayevent" => "PT_BOOLEAN:PSETID_Appointment:0x8215", |
|
246 | - "body" => PR_BODY, |
|
247 | - "busystatus" => "PT_LONG:PSETID_Appointment:0x8205", |
|
248 | - "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
249 | - "rtf" => PR_RTF_COMPRESSED, |
|
250 | - "dtstamp" => PR_LAST_MODIFICATION_TIME, |
|
251 | - "endtime" => "PT_SYSTIME:PSETID_Appointment:0x820e", |
|
252 | - "location" => "PT_STRING8:PSETID_Appointment:0x8208", |
|
253 | - "meetingstatus" => "PT_LONG:PSETID_Appointment:0x8217", |
|
254 | - "sensitivity" => PR_SENSITIVITY, |
|
255 | - "subject" => PR_SUBJECT, |
|
256 | - "starttime" => "PT_SYSTIME:PSETID_Appointment:0x820d", |
|
257 | - "uid" => "PT_BINARY:PSETID_Meeting:0x3", |
|
258 | - "nativebodytype" => PR_NATIVE_BODY_INFO, |
|
259 | - ]; |
|
260 | - } |
|
238 | + /** |
|
239 | + * Returns the MAPI to AS mapping for appointments. |
|
240 | + * |
|
241 | + * @return array |
|
242 | + */ |
|
243 | + public static function GetAppointmentMapping() { |
|
244 | + return [ |
|
245 | + "alldayevent" => "PT_BOOLEAN:PSETID_Appointment:0x8215", |
|
246 | + "body" => PR_BODY, |
|
247 | + "busystatus" => "PT_LONG:PSETID_Appointment:0x8205", |
|
248 | + "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
249 | + "rtf" => PR_RTF_COMPRESSED, |
|
250 | + "dtstamp" => PR_LAST_MODIFICATION_TIME, |
|
251 | + "endtime" => "PT_SYSTIME:PSETID_Appointment:0x820e", |
|
252 | + "location" => "PT_STRING8:PSETID_Appointment:0x8208", |
|
253 | + "meetingstatus" => "PT_LONG:PSETID_Appointment:0x8217", |
|
254 | + "sensitivity" => PR_SENSITIVITY, |
|
255 | + "subject" => PR_SUBJECT, |
|
256 | + "starttime" => "PT_SYSTIME:PSETID_Appointment:0x820d", |
|
257 | + "uid" => "PT_BINARY:PSETID_Meeting:0x3", |
|
258 | + "nativebodytype" => PR_NATIVE_BODY_INFO, |
|
259 | + ]; |
|
260 | + } |
|
261 | 261 | |
262 | - /** |
|
263 | - * Returns appointment specific MAPI properties. |
|
264 | - * |
|
265 | - * @return array |
|
266 | - */ |
|
267 | - public static function GetAppointmentProperties() { |
|
268 | - return [ |
|
269 | - "sourcekey" => PR_SOURCE_KEY, |
|
270 | - "representingentryid" => PR_SENT_REPRESENTING_ENTRYID, |
|
271 | - "representingname" => PR_SENT_REPRESENTING_NAME, |
|
272 | - "sentrepresentingemail" => PR_SENT_REPRESENTING_EMAIL_ADDRESS, |
|
273 | - "sentrepresentingaddt" => PR_SENT_REPRESENTING_ADDRTYPE, |
|
274 | - "sentrepresentinsrchk" => PR_SENT_REPRESENTING_SEARCH_KEY, |
|
275 | - "reminderset" => "PT_BOOLEAN:PSETID_Common:0x8503", |
|
276 | - "remindertime" => "PT_LONG:PSETID_Common:0x8501", |
|
277 | - "meetingstatus" => "PT_LONG:PSETID_Appointment:0x8217", |
|
278 | - "isrecurring" => "PT_BOOLEAN:PSETID_Appointment:0x8223", |
|
279 | - "recurringstate" => "PT_BINARY:PSETID_Appointment:0x8216", |
|
280 | - "timezonetag" => "PT_BINARY:PSETID_Appointment:0x8233", |
|
281 | - "timezonedesc" => "PT_STRING8:PSETID_Appointment:0x8234", |
|
282 | - "recurrenceend" => "PT_SYSTIME:PSETID_Appointment:0x8236", |
|
283 | - "responsestatus" => "PT_LONG:PSETID_Appointment:0x8218", |
|
284 | - "commonstart" => "PT_SYSTIME:PSETID_Common:0x8516", |
|
285 | - "commonend" => "PT_SYSTIME:PSETID_Common:0x8517", |
|
286 | - "reminderstart" => "PT_SYSTIME:PSETID_Common:0x8502", |
|
287 | - "duration" => "PT_LONG:PSETID_Appointment:0x8213", |
|
288 | - "private" => "PT_BOOLEAN:PSETID_Common:0x8506", |
|
289 | - "uid" => "PT_BINARY:PSETID_Meeting:0x23", |
|
290 | - "sideeffects" => "PT_LONG:PSETID_Common:0x8510", |
|
291 | - "flagdueby" => "PT_SYSTIME:PSETID_Common:0x8560", |
|
292 | - "icon" => PR_ICON_INDEX, |
|
293 | - "mrwassent" => "PT_BOOLEAN:PSETID_Appointment:0x8229", |
|
294 | - "endtime" => "PT_SYSTIME:PSETID_Appointment:0x820e", // this is here for calendar restriction, tnef and ical |
|
295 | - "starttime" => "PT_SYSTIME:PSETID_Appointment:0x820d", // this is here for calendar restriction, tnef and ical |
|
296 | - "clipstart" => "PT_SYSTIME:PSETID_Appointment:0x8235", // ical only |
|
297 | - "recurrencetype" => "PT_LONG:PSETID_Appointment:0x8231", |
|
298 | - "body" => PR_BODY, |
|
299 | - "rtfcompressed" => PR_RTF_COMPRESSED, |
|
300 | - "html" => PR_HTML, |
|
301 | - "rtfinsync" => PR_RTF_IN_SYNC, |
|
302 | - ]; |
|
303 | - } |
|
262 | + /** |
|
263 | + * Returns appointment specific MAPI properties. |
|
264 | + * |
|
265 | + * @return array |
|
266 | + */ |
|
267 | + public static function GetAppointmentProperties() { |
|
268 | + return [ |
|
269 | + "sourcekey" => PR_SOURCE_KEY, |
|
270 | + "representingentryid" => PR_SENT_REPRESENTING_ENTRYID, |
|
271 | + "representingname" => PR_SENT_REPRESENTING_NAME, |
|
272 | + "sentrepresentingemail" => PR_SENT_REPRESENTING_EMAIL_ADDRESS, |
|
273 | + "sentrepresentingaddt" => PR_SENT_REPRESENTING_ADDRTYPE, |
|
274 | + "sentrepresentinsrchk" => PR_SENT_REPRESENTING_SEARCH_KEY, |
|
275 | + "reminderset" => "PT_BOOLEAN:PSETID_Common:0x8503", |
|
276 | + "remindertime" => "PT_LONG:PSETID_Common:0x8501", |
|
277 | + "meetingstatus" => "PT_LONG:PSETID_Appointment:0x8217", |
|
278 | + "isrecurring" => "PT_BOOLEAN:PSETID_Appointment:0x8223", |
|
279 | + "recurringstate" => "PT_BINARY:PSETID_Appointment:0x8216", |
|
280 | + "timezonetag" => "PT_BINARY:PSETID_Appointment:0x8233", |
|
281 | + "timezonedesc" => "PT_STRING8:PSETID_Appointment:0x8234", |
|
282 | + "recurrenceend" => "PT_SYSTIME:PSETID_Appointment:0x8236", |
|
283 | + "responsestatus" => "PT_LONG:PSETID_Appointment:0x8218", |
|
284 | + "commonstart" => "PT_SYSTIME:PSETID_Common:0x8516", |
|
285 | + "commonend" => "PT_SYSTIME:PSETID_Common:0x8517", |
|
286 | + "reminderstart" => "PT_SYSTIME:PSETID_Common:0x8502", |
|
287 | + "duration" => "PT_LONG:PSETID_Appointment:0x8213", |
|
288 | + "private" => "PT_BOOLEAN:PSETID_Common:0x8506", |
|
289 | + "uid" => "PT_BINARY:PSETID_Meeting:0x23", |
|
290 | + "sideeffects" => "PT_LONG:PSETID_Common:0x8510", |
|
291 | + "flagdueby" => "PT_SYSTIME:PSETID_Common:0x8560", |
|
292 | + "icon" => PR_ICON_INDEX, |
|
293 | + "mrwassent" => "PT_BOOLEAN:PSETID_Appointment:0x8229", |
|
294 | + "endtime" => "PT_SYSTIME:PSETID_Appointment:0x820e", // this is here for calendar restriction, tnef and ical |
|
295 | + "starttime" => "PT_SYSTIME:PSETID_Appointment:0x820d", // this is here for calendar restriction, tnef and ical |
|
296 | + "clipstart" => "PT_SYSTIME:PSETID_Appointment:0x8235", // ical only |
|
297 | + "recurrencetype" => "PT_LONG:PSETID_Appointment:0x8231", |
|
298 | + "body" => PR_BODY, |
|
299 | + "rtfcompressed" => PR_RTF_COMPRESSED, |
|
300 | + "html" => PR_HTML, |
|
301 | + "rtfinsync" => PR_RTF_IN_SYNC, |
|
302 | + ]; |
|
303 | + } |
|
304 | 304 | |
305 | - /** |
|
306 | - * Returns the MAPI to AS mapping for tasks. |
|
307 | - * |
|
308 | - * @return array |
|
309 | - */ |
|
310 | - public static function GetTaskMapping() { |
|
311 | - return [ |
|
312 | - "body" => PR_BODY, |
|
313 | - "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
314 | - "complete" => "PT_BOOLEAN:PSETID_Task:0x811C", |
|
315 | - "datecompleted" => "PT_SYSTIME:PSETID_Task:0x810F", |
|
316 | - "duedate" => "PT_SYSTIME:PSETID_Task:0x8105", |
|
317 | - "utcduedate" => "PT_SYSTIME:PSETID_Common:0x8517", |
|
318 | - "utcstartdate" => "PT_SYSTIME:PSETID_Common:0x8516", |
|
319 | - "importance" => PR_IMPORTANCE, |
|
320 | - // recurrence |
|
321 | - // regenerate |
|
322 | - // deadoccur |
|
323 | - "reminderset" => "PT_BOOLEAN:PSETID_Common:0x8503", |
|
324 | - "remindertime" => "PT_SYSTIME:PSETID_Common:0x8502", |
|
325 | - "sensitivity" => PR_SENSITIVITY, |
|
326 | - "startdate" => "PT_SYSTIME:PSETID_Task:0x8104", |
|
327 | - "subject" => PR_SUBJECT, |
|
328 | - "rtf" => PR_RTF_COMPRESSED, |
|
329 | - "html" => PR_HTML, |
|
330 | - ]; |
|
331 | - } |
|
305 | + /** |
|
306 | + * Returns the MAPI to AS mapping for tasks. |
|
307 | + * |
|
308 | + * @return array |
|
309 | + */ |
|
310 | + public static function GetTaskMapping() { |
|
311 | + return [ |
|
312 | + "body" => PR_BODY, |
|
313 | + "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
314 | + "complete" => "PT_BOOLEAN:PSETID_Task:0x811C", |
|
315 | + "datecompleted" => "PT_SYSTIME:PSETID_Task:0x810F", |
|
316 | + "duedate" => "PT_SYSTIME:PSETID_Task:0x8105", |
|
317 | + "utcduedate" => "PT_SYSTIME:PSETID_Common:0x8517", |
|
318 | + "utcstartdate" => "PT_SYSTIME:PSETID_Common:0x8516", |
|
319 | + "importance" => PR_IMPORTANCE, |
|
320 | + // recurrence |
|
321 | + // regenerate |
|
322 | + // deadoccur |
|
323 | + "reminderset" => "PT_BOOLEAN:PSETID_Common:0x8503", |
|
324 | + "remindertime" => "PT_SYSTIME:PSETID_Common:0x8502", |
|
325 | + "sensitivity" => PR_SENSITIVITY, |
|
326 | + "startdate" => "PT_SYSTIME:PSETID_Task:0x8104", |
|
327 | + "subject" => PR_SUBJECT, |
|
328 | + "rtf" => PR_RTF_COMPRESSED, |
|
329 | + "html" => PR_HTML, |
|
330 | + ]; |
|
331 | + } |
|
332 | 332 | |
333 | - /** |
|
334 | - * Returns task specific MAPI properties. |
|
335 | - * |
|
336 | - * @return array |
|
337 | - */ |
|
338 | - public static function GetTaskProperties() { |
|
339 | - return [ |
|
340 | - "isrecurringtag" => "PT_BOOLEAN:PSETID_Task:0x8126", |
|
341 | - "recurringstate" => "PT_BINARY:PSETID_Task:0x8116", |
|
342 | - "deadoccur" => "PT_BOOLEAN:PSETID_Task:0x8109", |
|
343 | - "completion" => "PT_DOUBLE:PSETID_Task:0x8102", |
|
344 | - "status" => "PT_LONG:PSETID_Task:0x8101", |
|
345 | - "icon" => PR_ICON_INDEX, |
|
346 | - "owner" => "PT_STRING8:PSETID_Task:0x811F", |
|
347 | - "private" => "PT_BOOLEAN:PSETID_Common:0x8506", |
|
348 | - ]; |
|
349 | - } |
|
333 | + /** |
|
334 | + * Returns task specific MAPI properties. |
|
335 | + * |
|
336 | + * @return array |
|
337 | + */ |
|
338 | + public static function GetTaskProperties() { |
|
339 | + return [ |
|
340 | + "isrecurringtag" => "PT_BOOLEAN:PSETID_Task:0x8126", |
|
341 | + "recurringstate" => "PT_BINARY:PSETID_Task:0x8116", |
|
342 | + "deadoccur" => "PT_BOOLEAN:PSETID_Task:0x8109", |
|
343 | + "completion" => "PT_DOUBLE:PSETID_Task:0x8102", |
|
344 | + "status" => "PT_LONG:PSETID_Task:0x8101", |
|
345 | + "icon" => PR_ICON_INDEX, |
|
346 | + "owner" => "PT_STRING8:PSETID_Task:0x811F", |
|
347 | + "private" => "PT_BOOLEAN:PSETID_Common:0x8506", |
|
348 | + ]; |
|
349 | + } |
|
350 | 350 | |
351 | - /** |
|
352 | - * Returns the MAPI to AS mapping for email todo flags. |
|
353 | - * |
|
354 | - * @return array |
|
355 | - */ |
|
356 | - public static function GetMailFlagsMapping() { |
|
357 | - return [ |
|
358 | - "flagstatus" => PR_FLAG_STATUS, |
|
359 | - "flagtype" => "PT_STRING8:PSETID_Common:0x8530", |
|
360 | - "datecompleted" => "PT_SYSTIME:PSETID_Common:0x810F", |
|
361 | - "completetime" => PR_FLAG_COMPLETE_TIME, |
|
362 | - "startdate" => "PT_SYSTIME:PSETID_Task:0x8104", |
|
363 | - "duedate" => "PT_SYSTIME:PSETID_Task:0x8105", |
|
364 | - "utcstartdate" => "PT_SYSTIME:PSETID_Common:0x8516", |
|
365 | - "utcduedate" => "PT_SYSTIME:PSETID_Common:0x8517", |
|
366 | - "reminderset" => "PT_BOOLEAN:PSETID_Common:0x8503", |
|
367 | - "remindertime" => "PT_SYSTIME:PSETID_Common:0x8502", |
|
368 | - "ordinaldate" => "PT_SYSTIME:PSETID_Common:0x85A0", |
|
369 | - "subordinaldate" => "PT_STRING8:PSETID_Common:0x85A1", |
|
370 | - ]; |
|
371 | - } |
|
351 | + /** |
|
352 | + * Returns the MAPI to AS mapping for email todo flags. |
|
353 | + * |
|
354 | + * @return array |
|
355 | + */ |
|
356 | + public static function GetMailFlagsMapping() { |
|
357 | + return [ |
|
358 | + "flagstatus" => PR_FLAG_STATUS, |
|
359 | + "flagtype" => "PT_STRING8:PSETID_Common:0x8530", |
|
360 | + "datecompleted" => "PT_SYSTIME:PSETID_Common:0x810F", |
|
361 | + "completetime" => PR_FLAG_COMPLETE_TIME, |
|
362 | + "startdate" => "PT_SYSTIME:PSETID_Task:0x8104", |
|
363 | + "duedate" => "PT_SYSTIME:PSETID_Task:0x8105", |
|
364 | + "utcstartdate" => "PT_SYSTIME:PSETID_Common:0x8516", |
|
365 | + "utcduedate" => "PT_SYSTIME:PSETID_Common:0x8517", |
|
366 | + "reminderset" => "PT_BOOLEAN:PSETID_Common:0x8503", |
|
367 | + "remindertime" => "PT_SYSTIME:PSETID_Common:0x8502", |
|
368 | + "ordinaldate" => "PT_SYSTIME:PSETID_Common:0x85A0", |
|
369 | + "subordinaldate" => "PT_STRING8:PSETID_Common:0x85A1", |
|
370 | + ]; |
|
371 | + } |
|
372 | 372 | |
373 | - /** |
|
374 | - * Returns email todo flags' specific MAPI properties. |
|
375 | - * |
|
376 | - * @return array |
|
377 | - */ |
|
378 | - public static function GetMailFlagsProperties() { |
|
379 | - return [ |
|
380 | - "todoitemsflags" => PR_TODO_ITEM_FLAGS, |
|
381 | - "todotitle" => "PT_STRING8:PSETID_Common:0x85A4", |
|
382 | - "flagicon" => PR_FLAG_ICON, |
|
383 | - "replyrequested" => PR_REPLY_REQUESTED, |
|
384 | - "responserequested" => PR_RESPONSE_REQUESTED, |
|
385 | - "status" => "PT_LONG:PSETID_Task:0x8101", |
|
386 | - "completion" => "PT_DOUBLE:PSETID_Task:0x8102", |
|
387 | - "complete" => "PT_BOOLEAN:PSETID_Task:0x811C", |
|
388 | - ]; |
|
389 | - } |
|
373 | + /** |
|
374 | + * Returns email todo flags' specific MAPI properties. |
|
375 | + * |
|
376 | + * @return array |
|
377 | + */ |
|
378 | + public static function GetMailFlagsProperties() { |
|
379 | + return [ |
|
380 | + "todoitemsflags" => PR_TODO_ITEM_FLAGS, |
|
381 | + "todotitle" => "PT_STRING8:PSETID_Common:0x85A4", |
|
382 | + "flagicon" => PR_FLAG_ICON, |
|
383 | + "replyrequested" => PR_REPLY_REQUESTED, |
|
384 | + "responserequested" => PR_RESPONSE_REQUESTED, |
|
385 | + "status" => "PT_LONG:PSETID_Task:0x8101", |
|
386 | + "completion" => "PT_DOUBLE:PSETID_Task:0x8102", |
|
387 | + "complete" => "PT_BOOLEAN:PSETID_Task:0x811C", |
|
388 | + ]; |
|
389 | + } |
|
390 | 390 | |
391 | - /** |
|
392 | - * Returns the MAPI to AS mapping for notes. |
|
393 | - * |
|
394 | - * @return array |
|
395 | - */ |
|
396 | - public static function GetNoteMapping() { |
|
397 | - return [ |
|
398 | - "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
399 | - "lastmodified" => PR_LAST_MODIFICATION_TIME, |
|
400 | - "messageclass" => PR_MESSAGE_CLASS, |
|
401 | - "subject" => PR_SUBJECT, |
|
402 | - "Color" => "PT_LONG:PSETID_Note:0x8B00", |
|
403 | - "Iconindex" => PR_ICON_INDEX, |
|
404 | - ]; |
|
405 | - } |
|
391 | + /** |
|
392 | + * Returns the MAPI to AS mapping for notes. |
|
393 | + * |
|
394 | + * @return array |
|
395 | + */ |
|
396 | + public static function GetNoteMapping() { |
|
397 | + return [ |
|
398 | + "categories" => "PT_MV_STRING8:PS_PUBLIC_STRINGS:Keywords", |
|
399 | + "lastmodified" => PR_LAST_MODIFICATION_TIME, |
|
400 | + "messageclass" => PR_MESSAGE_CLASS, |
|
401 | + "subject" => PR_SUBJECT, |
|
402 | + "Color" => "PT_LONG:PSETID_Note:0x8B00", |
|
403 | + "Iconindex" => PR_ICON_INDEX, |
|
404 | + ]; |
|
405 | + } |
|
406 | 406 | |
407 | - /** |
|
408 | - * Returns note specific MAPI properties. |
|
409 | - * |
|
410 | - * @return array |
|
411 | - */ |
|
412 | - public static function GetNoteProperties() { |
|
413 | - return [ |
|
414 | - "body" => PR_BODY, |
|
415 | - "messageclass" => PR_MESSAGE_CLASS, |
|
416 | - "html" => PR_HTML, |
|
417 | - "internetcpid" => PR_INTERNET_CPID, |
|
418 | - ]; |
|
419 | - } |
|
407 | + /** |
|
408 | + * Returns note specific MAPI properties. |
|
409 | + * |
|
410 | + * @return array |
|
411 | + */ |
|
412 | + public static function GetNoteProperties() { |
|
413 | + return [ |
|
414 | + "body" => PR_BODY, |
|
415 | + "messageclass" => PR_MESSAGE_CLASS, |
|
416 | + "html" => PR_HTML, |
|
417 | + "internetcpid" => PR_INTERNET_CPID, |
|
418 | + ]; |
|
419 | + } |
|
420 | 420 | |
421 | - /** |
|
422 | - * Returns properties for sending an email. |
|
423 | - * |
|
424 | - * @return array |
|
425 | - */ |
|
426 | - public static function GetSendMailProperties() { |
|
427 | - return [ |
|
428 | - "outboxentryid" => PR_IPM_OUTBOX_ENTRYID, |
|
429 | - "ipmsentmailentryid" => PR_IPM_SENTMAIL_ENTRYID, |
|
430 | - "sentmailentryid" => PR_SENTMAIL_ENTRYID, |
|
431 | - "subject" => PR_SUBJECT, |
|
432 | - "messageclass" => PR_MESSAGE_CLASS, |
|
433 | - "deliverytime" => PR_MESSAGE_DELIVERY_TIME, |
|
434 | - "importance" => PR_IMPORTANCE, |
|
435 | - "priority" => PR_PRIORITY, |
|
436 | - "addrtype" => PR_ADDRTYPE, |
|
437 | - "emailaddress" => PR_EMAIL_ADDRESS, |
|
438 | - "displayname" => PR_DISPLAY_NAME, |
|
439 | - "recipienttype" => PR_RECIPIENT_TYPE, |
|
440 | - "entryid" => PR_ENTRYID, |
|
441 | - "iconindex" => PR_ICON_INDEX, |
|
442 | - "body" => PR_BODY, |
|
443 | - "html" => PR_HTML, |
|
444 | - "sentrepresentingname" => PR_SENT_REPRESENTING_NAME, |
|
445 | - "sentrepresentingemail" => PR_SENT_REPRESENTING_EMAIL_ADDRESS, |
|
446 | - "representingentryid" => PR_SENT_REPRESENTING_ENTRYID, |
|
447 | - "sentrepresentingaddt" => PR_SENT_REPRESENTING_ADDRTYPE, |
|
448 | - "sentrepresentinsrchk" => PR_SENT_REPRESENTING_SEARCH_KEY, |
|
449 | - "displayto" => PR_DISPLAY_TO, |
|
450 | - "displaycc" => PR_DISPLAY_CC, |
|
451 | - "clientsubmittime" => PR_CLIENT_SUBMIT_TIME, |
|
452 | - "attachnum" => PR_ATTACH_NUM, |
|
453 | - "attachdatabin" => PR_ATTACH_DATA_BIN, |
|
454 | - "internetcpid" => PR_INTERNET_CPID, |
|
455 | - "rtf" => PR_RTF_COMPRESSED, |
|
456 | - "rtfinsync" => PR_RTF_IN_SYNC, |
|
457 | - ]; |
|
458 | - } |
|
421 | + /** |
|
422 | + * Returns properties for sending an email. |
|
423 | + * |
|
424 | + * @return array |
|
425 | + */ |
|
426 | + public static function GetSendMailProperties() { |
|
427 | + return [ |
|
428 | + "outboxentryid" => PR_IPM_OUTBOX_ENTRYID, |
|
429 | + "ipmsentmailentryid" => PR_IPM_SENTMAIL_ENTRYID, |
|
430 | + "sentmailentryid" => PR_SENTMAIL_ENTRYID, |
|
431 | + "subject" => PR_SUBJECT, |
|
432 | + "messageclass" => PR_MESSAGE_CLASS, |
|
433 | + "deliverytime" => PR_MESSAGE_DELIVERY_TIME, |
|
434 | + "importance" => PR_IMPORTANCE, |
|
435 | + "priority" => PR_PRIORITY, |
|
436 | + "addrtype" => PR_ADDRTYPE, |
|
437 | + "emailaddress" => PR_EMAIL_ADDRESS, |
|
438 | + "displayname" => PR_DISPLAY_NAME, |
|
439 | + "recipienttype" => PR_RECIPIENT_TYPE, |
|
440 | + "entryid" => PR_ENTRYID, |
|
441 | + "iconindex" => PR_ICON_INDEX, |
|
442 | + "body" => PR_BODY, |
|
443 | + "html" => PR_HTML, |
|
444 | + "sentrepresentingname" => PR_SENT_REPRESENTING_NAME, |
|
445 | + "sentrepresentingemail" => PR_SENT_REPRESENTING_EMAIL_ADDRESS, |
|
446 | + "representingentryid" => PR_SENT_REPRESENTING_ENTRYID, |
|
447 | + "sentrepresentingaddt" => PR_SENT_REPRESENTING_ADDRTYPE, |
|
448 | + "sentrepresentinsrchk" => PR_SENT_REPRESENTING_SEARCH_KEY, |
|
449 | + "displayto" => PR_DISPLAY_TO, |
|
450 | + "displaycc" => PR_DISPLAY_CC, |
|
451 | + "clientsubmittime" => PR_CLIENT_SUBMIT_TIME, |
|
452 | + "attachnum" => PR_ATTACH_NUM, |
|
453 | + "attachdatabin" => PR_ATTACH_DATA_BIN, |
|
454 | + "internetcpid" => PR_INTERNET_CPID, |
|
455 | + "rtf" => PR_RTF_COMPRESSED, |
|
456 | + "rtfinsync" => PR_RTF_IN_SYNC, |
|
457 | + ]; |
|
458 | + } |
|
459 | 459 | } |
@@ -14,208 +14,208 @@ |
||
14 | 14 | define('SSLCERT_PASS', null); |
15 | 15 | |
16 | 16 | $supported_classes = [ |
17 | - "IPF.Note" => "SYNC_FOLDER_TYPE_USER_MAIL", |
|
18 | - "IPF.Task" => "SYNC_FOLDER_TYPE_USER_TASK", |
|
19 | - "IPF.Appointment" => "SYNC_FOLDER_TYPE_USER_APPOINTMENT", |
|
20 | - "IPF.Contact" => "SYNC_FOLDER_TYPE_USER_CONTACT", |
|
21 | - "IPF.StickyNote" => "SYNC_FOLDER_TYPE_USER_NOTE", |
|
17 | + "IPF.Note" => "SYNC_FOLDER_TYPE_USER_MAIL", |
|
18 | + "IPF.Task" => "SYNC_FOLDER_TYPE_USER_TASK", |
|
19 | + "IPF.Appointment" => "SYNC_FOLDER_TYPE_USER_APPOINTMENT", |
|
20 | + "IPF.Contact" => "SYNC_FOLDER_TYPE_USER_CONTACT", |
|
21 | + "IPF.StickyNote" => "SYNC_FOLDER_TYPE_USER_NOTE", |
|
22 | 22 | ]; |
23 | 23 | |
24 | 24 | main(); |
25 | 25 | |
26 | 26 | function main() { |
27 | - listfolders_configure(); |
|
28 | - listfolders_handle(); |
|
27 | + listfolders_configure(); |
|
28 | + listfolders_handle(); |
|
29 | 29 | } |
30 | 30 | |
31 | 31 | function listfolders_configure() { |
32 | - if (php_sapi_name() != "cli") { |
|
33 | - fwrite(STDERR, "This script can only be called from the CLI.\n"); |
|
32 | + if (php_sapi_name() != "cli") { |
|
33 | + fwrite(STDERR, "This script can only be called from the CLI.\n"); |
|
34 | 34 | |
35 | - exit(1); |
|
36 | - } |
|
35 | + exit(1); |
|
36 | + } |
|
37 | 37 | |
38 | - if (!function_exists("getopt")) { |
|
39 | - echo "PHP Function 'getopt()' not found. Please check your PHP version and settings.\n"; |
|
38 | + if (!function_exists("getopt")) { |
|
39 | + echo "PHP Function 'getopt()' not found. Please check your PHP version and settings.\n"; |
|
40 | 40 | |
41 | - exit(1); |
|
42 | - } |
|
41 | + exit(1); |
|
42 | + } |
|
43 | 43 | |
44 | - require 'mapi/mapi.util.php'; |
|
45 | - require 'mapi/mapidefs.php'; |
|
46 | - require 'mapi/mapicode.php'; |
|
47 | - require 'mapi/mapitags.php'; |
|
48 | - require 'mapi/mapiguid.php'; |
|
44 | + require 'mapi/mapi.util.php'; |
|
45 | + require 'mapi/mapidefs.php'; |
|
46 | + require 'mapi/mapicode.php'; |
|
47 | + require 'mapi/mapitags.php'; |
|
48 | + require 'mapi/mapiguid.php'; |
|
49 | 49 | } |
50 | 50 | |
51 | 51 | function listfolders_handle() { |
52 | - $shortoptions = "l:h:u:p:c:"; |
|
53 | - $options = getopt($shortoptions); |
|
54 | - |
|
55 | - $mapi = MAPI_SERVER; |
|
56 | - $sslcert_file = SSLCERT_FILE; |
|
57 | - $sslcert_pass = SSLCERT_PASS; |
|
58 | - $user = "SYSTEM"; |
|
59 | - $pass = ""; |
|
60 | - |
|
61 | - if (isset($options['h'])) { |
|
62 | - $mapi = $options['h']; |
|
63 | - } |
|
64 | - |
|
65 | - // accept a remote user |
|
66 | - if (isset($options['u'], $options['p'])) { |
|
67 | - $user = $options['u']; |
|
68 | - $pass = $options['p']; |
|
69 | - } |
|
70 | - // accept a certificate and passwort for login |
|
71 | - elseif (isset($options['c'], $options['p'])) { |
|
72 | - $sslcert_file = $options['c']; |
|
73 | - $sslcert_pass = $options['p']; |
|
74 | - } |
|
75 | - |
|
76 | - $zarafaAdmin = listfolders_zarafa_admin_setup($mapi, $user, $pass, $sslcert_file, $sslcert_pass); |
|
77 | - if (isset($zarafaAdmin['adminStore'], $options['l'])) { |
|
78 | - listfolders_getlist($zarafaAdmin['adminStore'], $zarafaAdmin['session'], trim($options['l'])); |
|
79 | - } |
|
80 | - else { |
|
81 | - echo "Usage:\n" . |
|
82 | - "listfolders.php [actions] [options]\n\n" . |
|
83 | - "Actions: [-l username]\n" . |
|
84 | - "\t-l username\tlist folders of user, for public folder use 'SYSTEM'\n\n" . |
|
85 | - "Global options: [-h path] [[-u remoteuser] [-p password]] [[-c certificate_path] [-p password]]\n" . |
|
86 | - "\t-h path\t\tconnect through <path>, e.g. file:///var/run/socket or https://10.0.0.1:237/grommunio\n" . |
|
87 | - "\t-u remoteuser\tlogin as authenticated administration user\n" . |
|
88 | - "\t-c certificate\tlogin with a ssl certificate located in this location, e.g. /etc/zarafa/ssl/client.pem\n" . |
|
89 | - "\t-p password\tpassword of the remoteuser or certificate\n\n"; |
|
90 | - } |
|
52 | + $shortoptions = "l:h:u:p:c:"; |
|
53 | + $options = getopt($shortoptions); |
|
54 | + |
|
55 | + $mapi = MAPI_SERVER; |
|
56 | + $sslcert_file = SSLCERT_FILE; |
|
57 | + $sslcert_pass = SSLCERT_PASS; |
|
58 | + $user = "SYSTEM"; |
|
59 | + $pass = ""; |
|
60 | + |
|
61 | + if (isset($options['h'])) { |
|
62 | + $mapi = $options['h']; |
|
63 | + } |
|
64 | + |
|
65 | + // accept a remote user |
|
66 | + if (isset($options['u'], $options['p'])) { |
|
67 | + $user = $options['u']; |
|
68 | + $pass = $options['p']; |
|
69 | + } |
|
70 | + // accept a certificate and passwort for login |
|
71 | + elseif (isset($options['c'], $options['p'])) { |
|
72 | + $sslcert_file = $options['c']; |
|
73 | + $sslcert_pass = $options['p']; |
|
74 | + } |
|
75 | + |
|
76 | + $zarafaAdmin = listfolders_zarafa_admin_setup($mapi, $user, $pass, $sslcert_file, $sslcert_pass); |
|
77 | + if (isset($zarafaAdmin['adminStore'], $options['l'])) { |
|
78 | + listfolders_getlist($zarafaAdmin['adminStore'], $zarafaAdmin['session'], trim($options['l'])); |
|
79 | + } |
|
80 | + else { |
|
81 | + echo "Usage:\n" . |
|
82 | + "listfolders.php [actions] [options]\n\n" . |
|
83 | + "Actions: [-l username]\n" . |
|
84 | + "\t-l username\tlist folders of user, for public folder use 'SYSTEM'\n\n" . |
|
85 | + "Global options: [-h path] [[-u remoteuser] [-p password]] [[-c certificate_path] [-p password]]\n" . |
|
86 | + "\t-h path\t\tconnect through <path>, e.g. file:///var/run/socket or https://10.0.0.1:237/grommunio\n" . |
|
87 | + "\t-u remoteuser\tlogin as authenticated administration user\n" . |
|
88 | + "\t-c certificate\tlogin with a ssl certificate located in this location, e.g. /etc/zarafa/ssl/client.pem\n" . |
|
89 | + "\t-p password\tpassword of the remoteuser or certificate\n\n"; |
|
90 | + } |
|
91 | 91 | } |
92 | 92 | |
93 | 93 | function listfolders_zarafa_admin_setup($mapi, $user, $pass, $sslcert_file, $sslcert_pass) { |
94 | - $session = @mapi_logon_zarafa($user, $pass, $mapi, $sslcert_file, $sslcert_pass, 0, 'script', 'script'); |
|
94 | + $session = @mapi_logon_zarafa($user, $pass, $mapi, $sslcert_file, $sslcert_pass, 0, 'script', 'script'); |
|
95 | 95 | |
96 | - if (!$session) { |
|
97 | - printf("User '%s' could not login. The script will exit. Errorcode: 0x%08x\n", $user, mapi_last_hresult()); |
|
96 | + if (!$session) { |
|
97 | + printf("User '%s' could not login. The script will exit. Errorcode: 0x%08x\n", $user, mapi_last_hresult()); |
|
98 | 98 | |
99 | - exit(1); |
|
100 | - } |
|
99 | + exit(1); |
|
100 | + } |
|
101 | 101 | |
102 | - $adminStore = null; |
|
103 | - $stores = @mapi_getmsgstorestable($session); |
|
104 | - $storeslist = @mapi_table_queryallrows($stores, [PR_ENTRYID, PR_DEFAULT_STORE, PR_MDB_PROVIDER]); |
|
105 | - foreach ($storeslist as $store) { |
|
106 | - if (isset($store[PR_DEFAULT_STORE]) && $store[PR_DEFAULT_STORE] == true) { |
|
107 | - $adminStore = @mapi_openmsgstore($session, $store[PR_ENTRYID]); |
|
102 | + $adminStore = null; |
|
103 | + $stores = @mapi_getmsgstorestable($session); |
|
104 | + $storeslist = @mapi_table_queryallrows($stores, [PR_ENTRYID, PR_DEFAULT_STORE, PR_MDB_PROVIDER]); |
|
105 | + foreach ($storeslist as $store) { |
|
106 | + if (isset($store[PR_DEFAULT_STORE]) && $store[PR_DEFAULT_STORE] == true) { |
|
107 | + $adminStore = @mapi_openmsgstore($session, $store[PR_ENTRYID]); |
|
108 | 108 | |
109 | - break; |
|
110 | - } |
|
111 | - } |
|
112 | - $zarafauserinfo['admin'] = 1; |
|
113 | - $admin = (isset($zarafauserinfo['admin']) && $zarafauserinfo['admin']) ? true : false; |
|
109 | + break; |
|
110 | + } |
|
111 | + } |
|
112 | + $zarafauserinfo['admin'] = 1; |
|
113 | + $admin = (isset($zarafauserinfo['admin']) && $zarafauserinfo['admin']) ? true : false; |
|
114 | 114 | |
115 | - if (!$stores || !$storeslist || !$adminStore || !$admin) { |
|
116 | - echo "There was error trying to log in as admin or retrieving admin info. The script will exit.\n"; |
|
115 | + if (!$stores || !$storeslist || !$adminStore || !$admin) { |
|
116 | + echo "There was error trying to log in as admin or retrieving admin info. The script will exit.\n"; |
|
117 | 117 | |
118 | - exit(1); |
|
119 | - } |
|
118 | + exit(1); |
|
119 | + } |
|
120 | 120 | |
121 | - return ["session" => $session, "adminStore" => $adminStore]; |
|
121 | + return ["session" => $session, "adminStore" => $adminStore]; |
|
122 | 122 | } |
123 | 123 | |
124 | 124 | function listfolders_getlist($adminStore, $session, $user) { |
125 | - global $supported_classes; |
|
126 | - |
|
127 | - if (strtoupper($user) == 'SYSTEM') { |
|
128 | - // Find the public store store |
|
129 | - $storestables = @mapi_getmsgstorestable($session); |
|
130 | - $result = @mapi_last_hresult(); |
|
131 | - |
|
132 | - if ($result == NOERROR) { |
|
133 | - $rows = @mapi_table_queryallrows($storestables, [PR_ENTRYID, PR_MDB_PROVIDER]); |
|
134 | - |
|
135 | - foreach ($rows as $row) { |
|
136 | - if (isset($row[PR_MDB_PROVIDER]) && $row[PR_MDB_PROVIDER] == ZARAFA_STORE_PUBLIC_GUID) { |
|
137 | - if (!isset($row[PR_ENTRYID])) { |
|
138 | - echo "Public folder are not available.\nIf this is a multi-tenancy system, use -u and -p and login with an admin user of the company.\nThe script will exit.\n"; |
|
139 | - |
|
140 | - exit(1); |
|
141 | - } |
|
142 | - $entryid = $row[PR_ENTRYID]; |
|
143 | - |
|
144 | - break; |
|
145 | - } |
|
146 | - } |
|
147 | - } |
|
148 | - } |
|
149 | - else { |
|
150 | - $entryid = @mapi_msgstore_createentryid($adminStore, $user); |
|
151 | - } |
|
152 | - |
|
153 | - $userStore = @mapi_openmsgstore($session, $entryid); |
|
154 | - $hresult = mapi_last_hresult(); |
|
155 | - |
|
156 | - // Cache the store for later use |
|
157 | - if ($hresult != NOERROR) { |
|
158 | - echo "Could not open store for '{$user}'. The script will exit.\n"; |
|
159 | - |
|
160 | - exit(1); |
|
161 | - } |
|
162 | - |
|
163 | - if (strtoupper($user) != 'SYSTEM') { |
|
164 | - $inbox = mapi_msgstore_getreceivefolder($userStore); |
|
165 | - if (mapi_last_hresult() != NOERROR) { |
|
166 | - printf("Could not open inbox for %s (0x%08X). The script will exit.\n", $user, mapi_last_hresult()); |
|
167 | - |
|
168 | - exit(1); |
|
169 | - } |
|
170 | - $inboxProps = mapi_getprops($inbox, [PR_SOURCE_KEY]); |
|
171 | - } |
|
172 | - |
|
173 | - $storeProps = mapi_getprops($userStore, [PR_IPM_OUTBOX_ENTRYID, PR_IPM_SENTMAIL_ENTRYID, PR_IPM_WASTEBASKET_ENTRYID]); |
|
174 | - $root = @mapi_msgstore_openentry($userStore, null); |
|
175 | - $h_table = @mapi_folder_gethierarchytable($root, CONVENIENT_DEPTH); |
|
176 | - $subfolders = @mapi_table_queryallrows($h_table, [PR_ENTRYID, PR_DISPLAY_NAME, PR_CONTAINER_CLASS, PR_SOURCE_KEY, PR_PARENT_SOURCE_KEY, PR_FOLDER_TYPE, PR_ATTR_HIDDEN]); |
|
177 | - |
|
178 | - echo "Available folders in store '{$user}':\n" . str_repeat("-", 50) . "\n"; |
|
179 | - foreach ($subfolders as $folder) { |
|
180 | - // do not display hidden and search folders |
|
181 | - if ((isset($folder[PR_ATTR_HIDDEN]) && $folder[PR_ATTR_HIDDEN]) || |
|
182 | - (isset($folder[PR_FOLDER_TYPE]) && $folder[PR_FOLDER_TYPE] == FOLDER_SEARCH)) { |
|
183 | - continue; |
|
184 | - } |
|
185 | - |
|
186 | - // handle some special folders |
|
187 | - if ((strtoupper($user) != 'SYSTEM') && |
|
188 | - ((isset($inboxProps[PR_SOURCE_KEY]) && $folder[PR_SOURCE_KEY] == $inboxProps[PR_SOURCE_KEY]) || |
|
189 | - $folder[PR_ENTRYID] == $storeProps[PR_IPM_SENTMAIL_ENTRYID] || |
|
190 | - $folder[PR_ENTRYID] == $storeProps[PR_IPM_WASTEBASKET_ENTRYID])) { |
|
191 | - $folder[PR_CONTAINER_CLASS] = "IPF.Note"; |
|
192 | - } |
|
193 | - |
|
194 | - if (isset($folder[PR_CONTAINER_CLASS]) && array_key_exists($folder[PR_CONTAINER_CLASS], $supported_classes)) { |
|
195 | - echo "Folder name:\t" . $folder[PR_DISPLAY_NAME] . "\n"; |
|
196 | - echo "Folder ID:\t" . bin2hex($folder[PR_SOURCE_KEY]) . "\n"; |
|
197 | - echo "Type:\t\t" . $supported_classes[$folder[PR_CONTAINER_CLASS]] . "\n"; |
|
198 | - echo "\n"; |
|
199 | - } |
|
200 | - } |
|
125 | + global $supported_classes; |
|
126 | + |
|
127 | + if (strtoupper($user) == 'SYSTEM') { |
|
128 | + // Find the public store store |
|
129 | + $storestables = @mapi_getmsgstorestable($session); |
|
130 | + $result = @mapi_last_hresult(); |
|
131 | + |
|
132 | + if ($result == NOERROR) { |
|
133 | + $rows = @mapi_table_queryallrows($storestables, [PR_ENTRYID, PR_MDB_PROVIDER]); |
|
134 | + |
|
135 | + foreach ($rows as $row) { |
|
136 | + if (isset($row[PR_MDB_PROVIDER]) && $row[PR_MDB_PROVIDER] == ZARAFA_STORE_PUBLIC_GUID) { |
|
137 | + if (!isset($row[PR_ENTRYID])) { |
|
138 | + echo "Public folder are not available.\nIf this is a multi-tenancy system, use -u and -p and login with an admin user of the company.\nThe script will exit.\n"; |
|
139 | + |
|
140 | + exit(1); |
|
141 | + } |
|
142 | + $entryid = $row[PR_ENTRYID]; |
|
143 | + |
|
144 | + break; |
|
145 | + } |
|
146 | + } |
|
147 | + } |
|
148 | + } |
|
149 | + else { |
|
150 | + $entryid = @mapi_msgstore_createentryid($adminStore, $user); |
|
151 | + } |
|
152 | + |
|
153 | + $userStore = @mapi_openmsgstore($session, $entryid); |
|
154 | + $hresult = mapi_last_hresult(); |
|
155 | + |
|
156 | + // Cache the store for later use |
|
157 | + if ($hresult != NOERROR) { |
|
158 | + echo "Could not open store for '{$user}'. The script will exit.\n"; |
|
159 | + |
|
160 | + exit(1); |
|
161 | + } |
|
162 | + |
|
163 | + if (strtoupper($user) != 'SYSTEM') { |
|
164 | + $inbox = mapi_msgstore_getreceivefolder($userStore); |
|
165 | + if (mapi_last_hresult() != NOERROR) { |
|
166 | + printf("Could not open inbox for %s (0x%08X). The script will exit.\n", $user, mapi_last_hresult()); |
|
167 | + |
|
168 | + exit(1); |
|
169 | + } |
|
170 | + $inboxProps = mapi_getprops($inbox, [PR_SOURCE_KEY]); |
|
171 | + } |
|
172 | + |
|
173 | + $storeProps = mapi_getprops($userStore, [PR_IPM_OUTBOX_ENTRYID, PR_IPM_SENTMAIL_ENTRYID, PR_IPM_WASTEBASKET_ENTRYID]); |
|
174 | + $root = @mapi_msgstore_openentry($userStore, null); |
|
175 | + $h_table = @mapi_folder_gethierarchytable($root, CONVENIENT_DEPTH); |
|
176 | + $subfolders = @mapi_table_queryallrows($h_table, [PR_ENTRYID, PR_DISPLAY_NAME, PR_CONTAINER_CLASS, PR_SOURCE_KEY, PR_PARENT_SOURCE_KEY, PR_FOLDER_TYPE, PR_ATTR_HIDDEN]); |
|
177 | + |
|
178 | + echo "Available folders in store '{$user}':\n" . str_repeat("-", 50) . "\n"; |
|
179 | + foreach ($subfolders as $folder) { |
|
180 | + // do not display hidden and search folders |
|
181 | + if ((isset($folder[PR_ATTR_HIDDEN]) && $folder[PR_ATTR_HIDDEN]) || |
|
182 | + (isset($folder[PR_FOLDER_TYPE]) && $folder[PR_FOLDER_TYPE] == FOLDER_SEARCH)) { |
|
183 | + continue; |
|
184 | + } |
|
185 | + |
|
186 | + // handle some special folders |
|
187 | + if ((strtoupper($user) != 'SYSTEM') && |
|
188 | + ((isset($inboxProps[PR_SOURCE_KEY]) && $folder[PR_SOURCE_KEY] == $inboxProps[PR_SOURCE_KEY]) || |
|
189 | + $folder[PR_ENTRYID] == $storeProps[PR_IPM_SENTMAIL_ENTRYID] || |
|
190 | + $folder[PR_ENTRYID] == $storeProps[PR_IPM_WASTEBASKET_ENTRYID])) { |
|
191 | + $folder[PR_CONTAINER_CLASS] = "IPF.Note"; |
|
192 | + } |
|
193 | + |
|
194 | + if (isset($folder[PR_CONTAINER_CLASS]) && array_key_exists($folder[PR_CONTAINER_CLASS], $supported_classes)) { |
|
195 | + echo "Folder name:\t" . $folder[PR_DISPLAY_NAME] . "\n"; |
|
196 | + echo "Folder ID:\t" . bin2hex($folder[PR_SOURCE_KEY]) . "\n"; |
|
197 | + echo "Type:\t\t" . $supported_classes[$folder[PR_CONTAINER_CLASS]] . "\n"; |
|
198 | + echo "\n"; |
|
199 | + } |
|
200 | + } |
|
201 | 201 | } |
202 | 202 | |
203 | 203 | function CheckMapiExtVersion($version = "") { |
204 | - // compare build number if requested |
|
205 | - if (preg_match('/^\d+$/', $version) && strlen($version) > 3) { |
|
206 | - $vs = preg_split('/-/', phpversion("mapi")); |
|
207 | - |
|
208 | - return $version <= $vs[1]; |
|
209 | - } |
|
210 | - |
|
211 | - if (extension_loaded("mapi")) { |
|
212 | - if (version_compare(phpversion("mapi"), $version) == -1) { |
|
213 | - return false; |
|
214 | - } |
|
215 | - } |
|
216 | - else { |
|
217 | - return false; |
|
218 | - } |
|
219 | - |
|
220 | - return true; |
|
204 | + // compare build number if requested |
|
205 | + if (preg_match('/^\d+$/', $version) && strlen($version) > 3) { |
|
206 | + $vs = preg_split('/-/', phpversion("mapi")); |
|
207 | + |
|
208 | + return $version <= $vs[1]; |
|
209 | + } |
|
210 | + |
|
211 | + if (extension_loaded("mapi")) { |
|
212 | + if (version_compare(phpversion("mapi"), $version) == -1) { |
|
213 | + return false; |
|
214 | + } |
|
215 | + } |
|
216 | + else { |
|
217 | + return false; |
|
218 | + } |
|
219 | + |
|
220 | + return true; |
|
221 | 221 | } |
@@ -78,14 +78,14 @@ discard block |
||
78 | 78 | listfolders_getlist($zarafaAdmin['adminStore'], $zarafaAdmin['session'], trim($options['l'])); |
79 | 79 | } |
80 | 80 | else { |
81 | - echo "Usage:\n" . |
|
82 | - "listfolders.php [actions] [options]\n\n" . |
|
83 | - "Actions: [-l username]\n" . |
|
84 | - "\t-l username\tlist folders of user, for public folder use 'SYSTEM'\n\n" . |
|
85 | - "Global options: [-h path] [[-u remoteuser] [-p password]] [[-c certificate_path] [-p password]]\n" . |
|
86 | - "\t-h path\t\tconnect through <path>, e.g. file:///var/run/socket or https://10.0.0.1:237/grommunio\n" . |
|
87 | - "\t-u remoteuser\tlogin as authenticated administration user\n" . |
|
88 | - "\t-c certificate\tlogin with a ssl certificate located in this location, e.g. /etc/zarafa/ssl/client.pem\n" . |
|
81 | + echo "Usage:\n". |
|
82 | + "listfolders.php [actions] [options]\n\n". |
|
83 | + "Actions: [-l username]\n". |
|
84 | + "\t-l username\tlist folders of user, for public folder use 'SYSTEM'\n\n". |
|
85 | + "Global options: [-h path] [[-u remoteuser] [-p password]] [[-c certificate_path] [-p password]]\n". |
|
86 | + "\t-h path\t\tconnect through <path>, e.g. file:///var/run/socket or https://10.0.0.1:237/grommunio\n". |
|
87 | + "\t-u remoteuser\tlogin as authenticated administration user\n". |
|
88 | + "\t-c certificate\tlogin with a ssl certificate located in this location, e.g. /etc/zarafa/ssl/client.pem\n". |
|
89 | 89 | "\t-p password\tpassword of the remoteuser or certificate\n\n"; |
90 | 90 | } |
91 | 91 | } |
@@ -175,7 +175,7 @@ discard block |
||
175 | 175 | $h_table = @mapi_folder_gethierarchytable($root, CONVENIENT_DEPTH); |
176 | 176 | $subfolders = @mapi_table_queryallrows($h_table, [PR_ENTRYID, PR_DISPLAY_NAME, PR_CONTAINER_CLASS, PR_SOURCE_KEY, PR_PARENT_SOURCE_KEY, PR_FOLDER_TYPE, PR_ATTR_HIDDEN]); |
177 | 177 | |
178 | - echo "Available folders in store '{$user}':\n" . str_repeat("-", 50) . "\n"; |
|
178 | + echo "Available folders in store '{$user}':\n".str_repeat("-", 50)."\n"; |
|
179 | 179 | foreach ($subfolders as $folder) { |
180 | 180 | // do not display hidden and search folders |
181 | 181 | if ((isset($folder[PR_ATTR_HIDDEN]) && $folder[PR_ATTR_HIDDEN]) || |
@@ -192,9 +192,9 @@ discard block |
||
192 | 192 | } |
193 | 193 | |
194 | 194 | if (isset($folder[PR_CONTAINER_CLASS]) && array_key_exists($folder[PR_CONTAINER_CLASS], $supported_classes)) { |
195 | - echo "Folder name:\t" . $folder[PR_DISPLAY_NAME] . "\n"; |
|
196 | - echo "Folder ID:\t" . bin2hex($folder[PR_SOURCE_KEY]) . "\n"; |
|
197 | - echo "Type:\t\t" . $supported_classes[$folder[PR_CONTAINER_CLASS]] . "\n"; |
|
195 | + echo "Folder name:\t".$folder[PR_DISPLAY_NAME]."\n"; |
|
196 | + echo "Folder ID:\t".bin2hex($folder[PR_SOURCE_KEY])."\n"; |
|
197 | + echo "Type:\t\t".$supported_classes[$folder[PR_CONTAINER_CLASS]]."\n"; |
|
198 | 198 | echo "\n"; |
199 | 199 | } |
200 | 200 | } |
@@ -76,8 +76,7 @@ discard block |
||
76 | 76 | $zarafaAdmin = listfolders_zarafa_admin_setup($mapi, $user, $pass, $sslcert_file, $sslcert_pass); |
77 | 77 | if (isset($zarafaAdmin['adminStore'], $options['l'])) { |
78 | 78 | listfolders_getlist($zarafaAdmin['adminStore'], $zarafaAdmin['session'], trim($options['l'])); |
79 | - } |
|
80 | - else { |
|
79 | + } else { |
|
81 | 80 | echo "Usage:\n" . |
82 | 81 | "listfolders.php [actions] [options]\n\n" . |
83 | 82 | "Actions: [-l username]\n" . |
@@ -145,8 +144,7 @@ discard block |
||
145 | 144 | } |
146 | 145 | } |
147 | 146 | } |
148 | - } |
|
149 | - else { |
|
147 | + } else { |
|
150 | 148 | $entryid = @mapi_msgstore_createentryid($adminStore, $user); |
151 | 149 | } |
152 | 150 | |
@@ -212,8 +210,7 @@ discard block |
||
212 | 210 | if (version_compare(phpversion("mapi"), $version) == -1) { |
213 | 211 | return false; |
214 | 212 | } |
215 | - } |
|
216 | - else { |
|
213 | + } else { |
|
217 | 214 | return false; |
218 | 215 | } |
219 | 216 |
@@ -17,220 +17,220 @@ |
||
17 | 17 | * convert the data into WBXML which is streamed to the PDA. |
18 | 18 | */ |
19 | 19 | class PHPWrapper { |
20 | - private $importer; |
|
21 | - private $mapiprovider; |
|
22 | - private $store; |
|
23 | - private $contentparameters; |
|
24 | - private $folderid; |
|
25 | - private $prefix; |
|
26 | - |
|
27 | - /** |
|
28 | - * Constructor of the PHPWrapper. |
|
29 | - * |
|
30 | - * @param resource $session |
|
31 | - * @param resource $store |
|
32 | - * @param IImportChanges $importer incoming changes from ICS are forwarded here |
|
33 | - * @param string $folderid the folder this wrapper was configured for |
|
34 | - * |
|
35 | - * @return |
|
36 | - */ |
|
37 | - public function __construct($session, $store, $importer, $folderid) { |
|
38 | - $this->importer = &$importer; |
|
39 | - $this->store = $store; |
|
40 | - $this->mapiprovider = new MAPIProvider($session, $this->store); |
|
41 | - $this->folderid = $folderid; |
|
42 | - $this->prefix = ''; |
|
43 | - |
|
44 | - if ($folderid) { |
|
45 | - $folderidHex = bin2hex($folderid); |
|
46 | - $folderid = GSync::GetDeviceManager()->GetFolderIdForBackendId($folderidHex); |
|
47 | - if ($folderid != $folderidHex) { |
|
48 | - $this->prefix = $folderid . ':'; |
|
49 | - } |
|
50 | - } |
|
51 | - } |
|
52 | - |
|
53 | - /** |
|
54 | - * Configures additional parameters used for content synchronization. |
|
55 | - * |
|
56 | - * @param ContentParameters $contentparameters |
|
57 | - * |
|
58 | - * @throws StatusException |
|
59 | - * |
|
60 | - * @return bool |
|
61 | - */ |
|
62 | - public function ConfigContentParameters($contentparameters) { |
|
63 | - $this->contentparameters = $contentparameters; |
|
64 | - |
|
65 | - return true; |
|
66 | - } |
|
67 | - |
|
68 | - /** |
|
69 | - * Implement MAPI interface. |
|
70 | - * |
|
71 | - * @param mixed $stream |
|
72 | - * @param mixed $flags |
|
73 | - */ |
|
74 | - public function Config($stream, $flags = 0) { |
|
75 | - } |
|
76 | - |
|
77 | - public function GetLastError($hresult, $ulflags, &$lpmapierror) { |
|
78 | - } |
|
79 | - |
|
80 | - public function UpdateState($stream) { |
|
81 | - } |
|
82 | - |
|
83 | - /** |
|
84 | - * Imports a single message. |
|
85 | - * |
|
86 | - * @param array $props |
|
87 | - * @param long $flags |
|
88 | - * @param object $retmapimessage |
|
89 | - * |
|
90 | - * @return long |
|
91 | - */ |
|
92 | - public function ImportMessageChange($props, $flags, $retmapimessage) { |
|
93 | - $sourcekey = $props[PR_SOURCE_KEY]; |
|
94 | - $parentsourcekey = $props[PR_PARENT_SOURCE_KEY]; |
|
95 | - $entryid = mapi_msgstore_entryidfromsourcekey($this->store, $parentsourcekey, $sourcekey); |
|
96 | - |
|
97 | - if (!$entryid) { |
|
98 | - return SYNC_E_IGNORE; |
|
99 | - } |
|
100 | - |
|
101 | - $mapimessage = mapi_msgstore_openentry($this->store, $entryid); |
|
102 | - |
|
103 | - try { |
|
104 | - SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageChange(): Getting message from MAPIProvider, sourcekey: '%s', parentsourcekey: '%s', entryid: '%s'", bin2hex($sourcekey), bin2hex($parentsourcekey), bin2hex($entryid))); |
|
105 | - |
|
106 | - $message = $this->mapiprovider->GetMessage($mapimessage, $this->contentparameters); |
|
107 | - |
|
108 | - // strip or do not send private messages from shared folders to the device |
|
109 | - if (MAPIUtils::IsMessageSharedAndPrivate($this->folderid, $mapimessage)) { |
|
110 | - if ($message->SupportsPrivateStripping()) { |
|
111 | - SLog::Write(LOGLEVEL_DEBUG, "PHPWrapper->ImportMessageChange(): stripping data of private message from a shared folder"); |
|
112 | - $message->StripData(Streamer::STRIP_PRIVATE_DATA); |
|
113 | - } |
|
114 | - else { |
|
115 | - SLog::Write(LOGLEVEL_DEBUG, "PHPWrapper->ImportMessageChange(): ignoring private message from a shared folder"); |
|
116 | - |
|
117 | - return SYNC_E_IGNORE; |
|
118 | - } |
|
119 | - } |
|
120 | - } |
|
121 | - catch (SyncObjectBrokenException $mbe) { |
|
122 | - $brokenSO = $mbe->GetSyncObject(); |
|
123 | - if (!$brokenSO) { |
|
124 | - SLog::Write(LOGLEVEL_ERROR, sprintf("PHPWrapper->ImportMessageChange(): Caught SyncObjectBrokenException but broken SyncObject available")); |
|
125 | - } |
|
126 | - else { |
|
127 | - if (!isset($brokenSO->id)) { |
|
128 | - $brokenSO->id = "Unknown ID"; |
|
129 | - SLog::Write(LOGLEVEL_ERROR, sprintf("PHPWrapper->ImportMessageChange(): Caught SyncObjectBrokenException but no ID of object set")); |
|
130 | - } |
|
131 | - GSync::GetDeviceManager()->AnnounceIgnoredMessage(false, $brokenSO->id, $brokenSO); |
|
132 | - } |
|
133 | - // tell MAPI to ignore the message |
|
134 | - return SYNC_E_IGNORE; |
|
135 | - } |
|
136 | - |
|
137 | - // substitute the MAPI SYNC_NEW_MESSAGE flag by a grommunio-sync proprietary flag |
|
138 | - if ($flags == SYNC_NEW_MESSAGE) { |
|
139 | - $message->flags = SYNC_NEWMESSAGE; |
|
140 | - } |
|
141 | - else { |
|
142 | - $message->flags = $flags; |
|
143 | - } |
|
144 | - |
|
145 | - $this->importer->ImportMessageChange($this->prefix . bin2hex($sourcekey), $message); |
|
146 | - SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageChange(): change for: '%s'", $this->prefix . bin2hex($sourcekey))); |
|
147 | - |
|
148 | - // Tell MAPI it doesn't need to do anything itself, as we've done all the work already. |
|
149 | - return SYNC_E_IGNORE; |
|
150 | - } |
|
151 | - |
|
152 | - /** |
|
153 | - * Imports a list of messages to be deleted. |
|
154 | - * |
|
155 | - * @param long $flags |
|
156 | - * @param array $sourcekeys array with sourcekeys |
|
157 | - * |
|
158 | - * @return |
|
159 | - */ |
|
160 | - public function ImportMessageDeletion($flags, $sourcekeys) { |
|
161 | - $amount = count($sourcekeys); |
|
162 | - SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageDeletion(): Received %d remove requests from ICS", $amount)); |
|
163 | - |
|
164 | - foreach ($sourcekeys as $sourcekey) { |
|
165 | - // TODO if we would know that ICS is removing the message because it's outside the sync interval, we could send a $asSoftDelete = true to the importer. Could they pass that via $flags? |
|
166 | - $this->importer->ImportMessageDeletion($this->prefix . bin2hex($sourcekey)); |
|
167 | - SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageDeletion(): delete for :'%s'", $this->prefix . bin2hex($sourcekey))); |
|
168 | - } |
|
169 | - } |
|
170 | - |
|
171 | - /** |
|
172 | - * Imports a list of messages to be deleted. |
|
173 | - * |
|
174 | - * @param mixed $readstates sourcekeys and message flags |
|
175 | - * |
|
176 | - * @return |
|
177 | - */ |
|
178 | - public function ImportPerUserReadStateChange($readstates) { |
|
179 | - foreach ($readstates as $readstate) { |
|
180 | - $this->importer->ImportMessageReadFlag($this->prefix . bin2hex($readstate["sourcekey"]), $readstate["flags"] & MSGFLAG_READ); |
|
181 | - SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportPerUserReadStateChange(): read for :'%s'", $this->prefix . bin2hex($readstate["sourcekey"]))); |
|
182 | - } |
|
183 | - } |
|
184 | - |
|
185 | - /** |
|
186 | - * Imports a message move |
|
187 | - * this is never called by ICS. |
|
188 | - * |
|
189 | - * @param mixed $sourcekeysrcfolder |
|
190 | - * @param mixed $sourcekeysrcmessage |
|
191 | - * @param mixed $message |
|
192 | - * @param mixed $sourcekeydestmessage |
|
193 | - * @param mixed $changenumdestmessage |
|
194 | - * |
|
195 | - * @return |
|
196 | - */ |
|
197 | - public function ImportMessageMove($sourcekeysrcfolder, $sourcekeysrcmessage, $message, $sourcekeydestmessage, $changenumdestmessage) { |
|
198 | - // Never called |
|
199 | - } |
|
200 | - |
|
201 | - /** |
|
202 | - * Imports a single folder change. |
|
203 | - * |
|
204 | - * @param array $props properties of the changed folder |
|
205 | - * |
|
206 | - * @return |
|
207 | - */ |
|
208 | - public function ImportFolderChange($props) { |
|
209 | - $folder = $this->mapiprovider->GetFolder($props); |
|
210 | - |
|
211 | - // do not import folder if there is something "wrong" with it |
|
212 | - if ($folder === false) { |
|
213 | - return 0; |
|
214 | - } |
|
215 | - |
|
216 | - $this->importer->ImportFolderChange($folder); |
|
217 | - |
|
218 | - return 0; |
|
219 | - } |
|
220 | - |
|
221 | - /** |
|
222 | - * Imports a list of folders which are to be deleted. |
|
223 | - * |
|
224 | - * @param long $flags |
|
225 | - * @param mixed $sourcekeys array with sourcekeys |
|
226 | - * |
|
227 | - * @return |
|
228 | - */ |
|
229 | - public function ImportFolderDeletion($flags, $sourcekeys) { |
|
230 | - foreach ($sourcekeys as $sourcekey) { |
|
231 | - $this->importer->ImportFolderDeletion(SyncFolder::GetObject(GSync::GetDeviceManager()->GetFolderIdForBackendId(bin2hex($sourcekey)))); |
|
232 | - } |
|
233 | - |
|
234 | - return 0; |
|
235 | - } |
|
20 | + private $importer; |
|
21 | + private $mapiprovider; |
|
22 | + private $store; |
|
23 | + private $contentparameters; |
|
24 | + private $folderid; |
|
25 | + private $prefix; |
|
26 | + |
|
27 | + /** |
|
28 | + * Constructor of the PHPWrapper. |
|
29 | + * |
|
30 | + * @param resource $session |
|
31 | + * @param resource $store |
|
32 | + * @param IImportChanges $importer incoming changes from ICS are forwarded here |
|
33 | + * @param string $folderid the folder this wrapper was configured for |
|
34 | + * |
|
35 | + * @return |
|
36 | + */ |
|
37 | + public function __construct($session, $store, $importer, $folderid) { |
|
38 | + $this->importer = &$importer; |
|
39 | + $this->store = $store; |
|
40 | + $this->mapiprovider = new MAPIProvider($session, $this->store); |
|
41 | + $this->folderid = $folderid; |
|
42 | + $this->prefix = ''; |
|
43 | + |
|
44 | + if ($folderid) { |
|
45 | + $folderidHex = bin2hex($folderid); |
|
46 | + $folderid = GSync::GetDeviceManager()->GetFolderIdForBackendId($folderidHex); |
|
47 | + if ($folderid != $folderidHex) { |
|
48 | + $this->prefix = $folderid . ':'; |
|
49 | + } |
|
50 | + } |
|
51 | + } |
|
52 | + |
|
53 | + /** |
|
54 | + * Configures additional parameters used for content synchronization. |
|
55 | + * |
|
56 | + * @param ContentParameters $contentparameters |
|
57 | + * |
|
58 | + * @throws StatusException |
|
59 | + * |
|
60 | + * @return bool |
|
61 | + */ |
|
62 | + public function ConfigContentParameters($contentparameters) { |
|
63 | + $this->contentparameters = $contentparameters; |
|
64 | + |
|
65 | + return true; |
|
66 | + } |
|
67 | + |
|
68 | + /** |
|
69 | + * Implement MAPI interface. |
|
70 | + * |
|
71 | + * @param mixed $stream |
|
72 | + * @param mixed $flags |
|
73 | + */ |
|
74 | + public function Config($stream, $flags = 0) { |
|
75 | + } |
|
76 | + |
|
77 | + public function GetLastError($hresult, $ulflags, &$lpmapierror) { |
|
78 | + } |
|
79 | + |
|
80 | + public function UpdateState($stream) { |
|
81 | + } |
|
82 | + |
|
83 | + /** |
|
84 | + * Imports a single message. |
|
85 | + * |
|
86 | + * @param array $props |
|
87 | + * @param long $flags |
|
88 | + * @param object $retmapimessage |
|
89 | + * |
|
90 | + * @return long |
|
91 | + */ |
|
92 | + public function ImportMessageChange($props, $flags, $retmapimessage) { |
|
93 | + $sourcekey = $props[PR_SOURCE_KEY]; |
|
94 | + $parentsourcekey = $props[PR_PARENT_SOURCE_KEY]; |
|
95 | + $entryid = mapi_msgstore_entryidfromsourcekey($this->store, $parentsourcekey, $sourcekey); |
|
96 | + |
|
97 | + if (!$entryid) { |
|
98 | + return SYNC_E_IGNORE; |
|
99 | + } |
|
100 | + |
|
101 | + $mapimessage = mapi_msgstore_openentry($this->store, $entryid); |
|
102 | + |
|
103 | + try { |
|
104 | + SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageChange(): Getting message from MAPIProvider, sourcekey: '%s', parentsourcekey: '%s', entryid: '%s'", bin2hex($sourcekey), bin2hex($parentsourcekey), bin2hex($entryid))); |
|
105 | + |
|
106 | + $message = $this->mapiprovider->GetMessage($mapimessage, $this->contentparameters); |
|
107 | + |
|
108 | + // strip or do not send private messages from shared folders to the device |
|
109 | + if (MAPIUtils::IsMessageSharedAndPrivate($this->folderid, $mapimessage)) { |
|
110 | + if ($message->SupportsPrivateStripping()) { |
|
111 | + SLog::Write(LOGLEVEL_DEBUG, "PHPWrapper->ImportMessageChange(): stripping data of private message from a shared folder"); |
|
112 | + $message->StripData(Streamer::STRIP_PRIVATE_DATA); |
|
113 | + } |
|
114 | + else { |
|
115 | + SLog::Write(LOGLEVEL_DEBUG, "PHPWrapper->ImportMessageChange(): ignoring private message from a shared folder"); |
|
116 | + |
|
117 | + return SYNC_E_IGNORE; |
|
118 | + } |
|
119 | + } |
|
120 | + } |
|
121 | + catch (SyncObjectBrokenException $mbe) { |
|
122 | + $brokenSO = $mbe->GetSyncObject(); |
|
123 | + if (!$brokenSO) { |
|
124 | + SLog::Write(LOGLEVEL_ERROR, sprintf("PHPWrapper->ImportMessageChange(): Caught SyncObjectBrokenException but broken SyncObject available")); |
|
125 | + } |
|
126 | + else { |
|
127 | + if (!isset($brokenSO->id)) { |
|
128 | + $brokenSO->id = "Unknown ID"; |
|
129 | + SLog::Write(LOGLEVEL_ERROR, sprintf("PHPWrapper->ImportMessageChange(): Caught SyncObjectBrokenException but no ID of object set")); |
|
130 | + } |
|
131 | + GSync::GetDeviceManager()->AnnounceIgnoredMessage(false, $brokenSO->id, $brokenSO); |
|
132 | + } |
|
133 | + // tell MAPI to ignore the message |
|
134 | + return SYNC_E_IGNORE; |
|
135 | + } |
|
136 | + |
|
137 | + // substitute the MAPI SYNC_NEW_MESSAGE flag by a grommunio-sync proprietary flag |
|
138 | + if ($flags == SYNC_NEW_MESSAGE) { |
|
139 | + $message->flags = SYNC_NEWMESSAGE; |
|
140 | + } |
|
141 | + else { |
|
142 | + $message->flags = $flags; |
|
143 | + } |
|
144 | + |
|
145 | + $this->importer->ImportMessageChange($this->prefix . bin2hex($sourcekey), $message); |
|
146 | + SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageChange(): change for: '%s'", $this->prefix . bin2hex($sourcekey))); |
|
147 | + |
|
148 | + // Tell MAPI it doesn't need to do anything itself, as we've done all the work already. |
|
149 | + return SYNC_E_IGNORE; |
|
150 | + } |
|
151 | + |
|
152 | + /** |
|
153 | + * Imports a list of messages to be deleted. |
|
154 | + * |
|
155 | + * @param long $flags |
|
156 | + * @param array $sourcekeys array with sourcekeys |
|
157 | + * |
|
158 | + * @return |
|
159 | + */ |
|
160 | + public function ImportMessageDeletion($flags, $sourcekeys) { |
|
161 | + $amount = count($sourcekeys); |
|
162 | + SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageDeletion(): Received %d remove requests from ICS", $amount)); |
|
163 | + |
|
164 | + foreach ($sourcekeys as $sourcekey) { |
|
165 | + // TODO if we would know that ICS is removing the message because it's outside the sync interval, we could send a $asSoftDelete = true to the importer. Could they pass that via $flags? |
|
166 | + $this->importer->ImportMessageDeletion($this->prefix . bin2hex($sourcekey)); |
|
167 | + SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageDeletion(): delete for :'%s'", $this->prefix . bin2hex($sourcekey))); |
|
168 | + } |
|
169 | + } |
|
170 | + |
|
171 | + /** |
|
172 | + * Imports a list of messages to be deleted. |
|
173 | + * |
|
174 | + * @param mixed $readstates sourcekeys and message flags |
|
175 | + * |
|
176 | + * @return |
|
177 | + */ |
|
178 | + public function ImportPerUserReadStateChange($readstates) { |
|
179 | + foreach ($readstates as $readstate) { |
|
180 | + $this->importer->ImportMessageReadFlag($this->prefix . bin2hex($readstate["sourcekey"]), $readstate["flags"] & MSGFLAG_READ); |
|
181 | + SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportPerUserReadStateChange(): read for :'%s'", $this->prefix . bin2hex($readstate["sourcekey"]))); |
|
182 | + } |
|
183 | + } |
|
184 | + |
|
185 | + /** |
|
186 | + * Imports a message move |
|
187 | + * this is never called by ICS. |
|
188 | + * |
|
189 | + * @param mixed $sourcekeysrcfolder |
|
190 | + * @param mixed $sourcekeysrcmessage |
|
191 | + * @param mixed $message |
|
192 | + * @param mixed $sourcekeydestmessage |
|
193 | + * @param mixed $changenumdestmessage |
|
194 | + * |
|
195 | + * @return |
|
196 | + */ |
|
197 | + public function ImportMessageMove($sourcekeysrcfolder, $sourcekeysrcmessage, $message, $sourcekeydestmessage, $changenumdestmessage) { |
|
198 | + // Never called |
|
199 | + } |
|
200 | + |
|
201 | + /** |
|
202 | + * Imports a single folder change. |
|
203 | + * |
|
204 | + * @param array $props properties of the changed folder |
|
205 | + * |
|
206 | + * @return |
|
207 | + */ |
|
208 | + public function ImportFolderChange($props) { |
|
209 | + $folder = $this->mapiprovider->GetFolder($props); |
|
210 | + |
|
211 | + // do not import folder if there is something "wrong" with it |
|
212 | + if ($folder === false) { |
|
213 | + return 0; |
|
214 | + } |
|
215 | + |
|
216 | + $this->importer->ImportFolderChange($folder); |
|
217 | + |
|
218 | + return 0; |
|
219 | + } |
|
220 | + |
|
221 | + /** |
|
222 | + * Imports a list of folders which are to be deleted. |
|
223 | + * |
|
224 | + * @param long $flags |
|
225 | + * @param mixed $sourcekeys array with sourcekeys |
|
226 | + * |
|
227 | + * @return |
|
228 | + */ |
|
229 | + public function ImportFolderDeletion($flags, $sourcekeys) { |
|
230 | + foreach ($sourcekeys as $sourcekey) { |
|
231 | + $this->importer->ImportFolderDeletion(SyncFolder::GetObject(GSync::GetDeviceManager()->GetFolderIdForBackendId(bin2hex($sourcekey)))); |
|
232 | + } |
|
233 | + |
|
234 | + return 0; |
|
235 | + } |
|
236 | 236 | } |
@@ -45,7 +45,7 @@ discard block |
||
45 | 45 | $folderidHex = bin2hex($folderid); |
46 | 46 | $folderid = GSync::GetDeviceManager()->GetFolderIdForBackendId($folderidHex); |
47 | 47 | if ($folderid != $folderidHex) { |
48 | - $this->prefix = $folderid . ':'; |
|
48 | + $this->prefix = $folderid.':'; |
|
49 | 49 | } |
50 | 50 | } |
51 | 51 | } |
@@ -142,8 +142,8 @@ discard block |
||
142 | 142 | $message->flags = $flags; |
143 | 143 | } |
144 | 144 | |
145 | - $this->importer->ImportMessageChange($this->prefix . bin2hex($sourcekey), $message); |
|
146 | - SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageChange(): change for: '%s'", $this->prefix . bin2hex($sourcekey))); |
|
145 | + $this->importer->ImportMessageChange($this->prefix.bin2hex($sourcekey), $message); |
|
146 | + SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageChange(): change for: '%s'", $this->prefix.bin2hex($sourcekey))); |
|
147 | 147 | |
148 | 148 | // Tell MAPI it doesn't need to do anything itself, as we've done all the work already. |
149 | 149 | return SYNC_E_IGNORE; |
@@ -163,8 +163,8 @@ discard block |
||
163 | 163 | |
164 | 164 | foreach ($sourcekeys as $sourcekey) { |
165 | 165 | // TODO if we would know that ICS is removing the message because it's outside the sync interval, we could send a $asSoftDelete = true to the importer. Could they pass that via $flags? |
166 | - $this->importer->ImportMessageDeletion($this->prefix . bin2hex($sourcekey)); |
|
167 | - SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageDeletion(): delete for :'%s'", $this->prefix . bin2hex($sourcekey))); |
|
166 | + $this->importer->ImportMessageDeletion($this->prefix.bin2hex($sourcekey)); |
|
167 | + SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportMessageDeletion(): delete for :'%s'", $this->prefix.bin2hex($sourcekey))); |
|
168 | 168 | } |
169 | 169 | } |
170 | 170 | |
@@ -177,8 +177,8 @@ discard block |
||
177 | 177 | */ |
178 | 178 | public function ImportPerUserReadStateChange($readstates) { |
179 | 179 | foreach ($readstates as $readstate) { |
180 | - $this->importer->ImportMessageReadFlag($this->prefix . bin2hex($readstate["sourcekey"]), $readstate["flags"] & MSGFLAG_READ); |
|
181 | - SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportPerUserReadStateChange(): read for :'%s'", $this->prefix . bin2hex($readstate["sourcekey"]))); |
|
180 | + $this->importer->ImportMessageReadFlag($this->prefix.bin2hex($readstate["sourcekey"]), $readstate["flags"] & MSGFLAG_READ); |
|
181 | + SLog::Write(LOGLEVEL_DEBUG, sprintf("PHPWrapper->ImportPerUserReadStateChange(): read for :'%s'", $this->prefix.bin2hex($readstate["sourcekey"]))); |
|
182 | 182 | } |
183 | 183 | } |
184 | 184 |
@@ -110,20 +110,17 @@ discard block |
||
110 | 110 | if ($message->SupportsPrivateStripping()) { |
111 | 111 | SLog::Write(LOGLEVEL_DEBUG, "PHPWrapper->ImportMessageChange(): stripping data of private message from a shared folder"); |
112 | 112 | $message->StripData(Streamer::STRIP_PRIVATE_DATA); |
113 | - } |
|
114 | - else { |
|
113 | + } else { |
|
115 | 114 | SLog::Write(LOGLEVEL_DEBUG, "PHPWrapper->ImportMessageChange(): ignoring private message from a shared folder"); |
116 | 115 | |
117 | 116 | return SYNC_E_IGNORE; |
118 | 117 | } |
119 | 118 | } |
120 | - } |
|
121 | - catch (SyncObjectBrokenException $mbe) { |
|
119 | + } catch (SyncObjectBrokenException $mbe) { |
|
122 | 120 | $brokenSO = $mbe->GetSyncObject(); |
123 | 121 | if (!$brokenSO) { |
124 | 122 | SLog::Write(LOGLEVEL_ERROR, sprintf("PHPWrapper->ImportMessageChange(): Caught SyncObjectBrokenException but broken SyncObject available")); |
125 | - } |
|
126 | - else { |
|
123 | + } else { |
|
127 | 124 | if (!isset($brokenSO->id)) { |
128 | 125 | $brokenSO->id = "Unknown ID"; |
129 | 126 | SLog::Write(LOGLEVEL_ERROR, sprintf("PHPWrapper->ImportMessageChange(): Caught SyncObjectBrokenException but no ID of object set")); |
@@ -137,8 +134,7 @@ discard block |
||
137 | 134 | // substitute the MAPI SYNC_NEW_MESSAGE flag by a grommunio-sync proprietary flag |
138 | 135 | if ($flags == SYNC_NEW_MESSAGE) { |
139 | 136 | $message->flags = SYNC_NEWMESSAGE; |
140 | - } |
|
141 | - else { |
|
137 | + } else { |
|
142 | 138 | $message->flags = $flags; |
143 | 139 | } |
144 | 140 |