GCC Code Coverage Report


Directory: ./
File: tmp_project/PhoenixTex2Html/src/PTimeTable/ptimetable_invitation.cpp
Date: 2025-03-24 18:12:43
Exec Total Coverage
Lines: 117 141 83.0%
Branches: 220 369 59.6%

Line Branch Exec Source
1 /***************************************
2 Auteur : Pierre Aubert
3 Mail : pierre.aubert@lapp.in2p3.fr
4 Licence : CeCILL-C
5 ****************************************/
6
7 #include <iomanip>
8 #include <time.h>
9
10 #include "platexobj_rawtext.h"
11
12 #include "ptimetable_invitation.h"
13
14
15 ///Begins an invitation
16 /** @param name : name of entity which create this invitation
17 * @param motif : motif of the invitation
18 * @return begining of the invitation
19 */
20 8 PString ptimetable_beginInvitation(const PString & name, const PString & motif){
21 8 PString body("");
22
1/1
✓ Branch 1 taken 8 times.
8 body += "BEGIN:VCALENDAR\n";
23
1/1
✓ Branch 1 taken 8 times.
8 body += "VERSION:2.0\n";
24
5/5
✓ Branch 1 taken 8 times.
✓ Branch 4 taken 8 times.
✓ Branch 7 taken 8 times.
✓ Branch 10 taken 8 times.
✓ Branch 13 taken 8 times.
8 body += "PRODID:-//"+name+"//"+motif+"/\n";
25 8 return body;
26 }
27
28 ///Ends an invitation
29 /** @return end of the invitation
30 */
31 8 PString ptimetable_endInvitation(){
32 8 return "END:VCALENDAR\n\n";
33 }
34
35 ///Convert the given date and time into calendar time
36 /** @param date : date of the event
37 * @param texTime : time of the event
38 * @return corresponding calendar time
39 */
40 1308 PString ptimetable_dateTimeToCalendarTime(const PLatexDate & date, const PLatexTime & texTime){
41
1/1
✓ Branch 1 taken 1308 times.
1308 std::stringstream timeStr;
42
10/10
✓ Branch 1 taken 1308 times.
✓ Branch 4 taken 1308 times.
✓ Branch 8 taken 1308 times.
✓ Branch 12 taken 1308 times.
✓ Branch 15 taken 1308 times.
✓ Branch 18 taken 1308 times.
✓ Branch 22 taken 1308 times.
✓ Branch 26 taken 1308 times.
✓ Branch 29 taken 1308 times.
✓ Branch 32 taken 1308 times.
1308 timeStr << date.getYear() << std::setfill('0') << std::setw(2) << date.getMonth() << std::setfill('0') << std::setw(2) << date.getDay();
43
10/10
✓ Branch 1 taken 1308 times.
✓ Branch 5 taken 1308 times.
✓ Branch 9 taken 1308 times.
✓ Branch 12 taken 1308 times.
✓ Branch 15 taken 1308 times.
✓ Branch 19 taken 1308 times.
✓ Branch 23 taken 1308 times.
✓ Branch 26 taken 1308 times.
✓ Branch 29 taken 1308 times.
✓ Branch 32 taken 1308 times.
1308 timeStr << "T" << std::setfill('0') << std::setw(2) << texTime.getHour() << std::setfill('0') << std::setw(2) << texTime.getMinute() << "00";
44
2/2
✓ Branch 1 taken 1308 times.
✓ Branch 4 taken 1308 times.
3924 return timeStr.str();
45 1308 }
46
47 ///Convert the current time into the calendar time
48 /** @return corresponding calendar time
49 */
50 654 PString ptimetable_currentTimeToCalendarTime(){
51 654 time_t timestamp = time(NULL);
52 654 struct tm * currentDate = localtime(&timestamp);
53
1/1
✓ Branch 1 taken 654 times.
654 std::stringstream timeStr;
54
7/7
✓ Branch 1 taken 654 times.
✓ Branch 5 taken 654 times.
✓ Branch 9 taken 654 times.
✓ Branch 12 taken 654 times.
✓ Branch 16 taken 654 times.
✓ Branch 20 taken 654 times.
✓ Branch 23 taken 654 times.
654 timeStr << (currentDate->tm_year + 1900) << std::setfill('0') << std::setw(2) << (currentDate->tm_mon + 1) << std::setfill('0') << std::setw(2) << currentDate->tm_mday;
55
8/8
✓ Branch 1 taken 654 times.
✓ Branch 5 taken 654 times.
✓ Branch 9 taken 654 times.
✓ Branch 12 taken 654 times.
✓ Branch 16 taken 654 times.
✓ Branch 20 taken 654 times.
✓ Branch 23 taken 654 times.
✓ Branch 26 taken 654 times.
654 timeStr << "T" << std::setfill('0') << std::setw(2) << (currentDate->tm_hour - currentDate->tm_gmtoff/3600) << std::setfill('0') << std::setw(2) << currentDate->tm_min << "00";
56
2/2
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
1962 return timeStr.str();
57 654 }
58
59 ///Convert a block into a event calendar
60 /** @param[out] counter : counter of block to make sure UID is unique
61 * @param block : PTimeTableBlock to be converted
62 * @return corresponding event calendar
63 */
64 1323 PString ptimetable_blockToEvent(size_t & counter, const PTimeTableBlock & block){
65
4/4
✓ Branch 1 taken 1323 times.
✓ Branch 4 taken 669 times.
✓ Branch 5 taken 654 times.
✓ Branch 7 taken 669 times.
1323 if(block.getVecSpeaker().size() == 0lu){return "";}
66
2/2
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
654 PString body(""), currentTimeStamp(ptimetable_currentTimeToCalendarTime());
67
1/1
✓ Branch 1 taken 654 times.
654 body += "BEGIN:VEVENT\n";
68
1/1
✓ Branch 1 taken 654 times.
654 body += "CLASS:PUBLIC\n";
69
3/3
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
✓ Branch 7 taken 654 times.
654 body += "DTSTAMP:"+currentTimeStamp+"\n";
70
71
1/1
✓ Branch 1 taken 654 times.
654 std::stringstream uidStr;
72
3/3
✓ Branch 2 taken 654 times.
✓ Branch 6 taken 654 times.
✓ Branch 9 taken 654 times.
654 uidStr << std::setfill('0') << std::setw(4) << counter;
73 654 ++counter;
74
6/6
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
✓ Branch 7 taken 654 times.
✓ Branch 10 taken 654 times.
✓ Branch 13 taken 654 times.
✓ Branch 16 taken 654 times.
654 body += "UID:TH8WMR_PNR"+uidStr.str()+"_"+currentTimeStamp+"\n";
75
6/6
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
✓ Branch 7 taken 654 times.
✓ Branch 10 taken 654 times.
✓ Branch 13 taken 654 times.
✓ Branch 16 taken 654 times.
654 body += "DTSTART;TZID=Europe/Paris:"+ptimetable_dateTimeToCalendarTime(block.getDate(), block.getBeginTime())+"\n";
76
6/6
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
✓ Branch 7 taken 654 times.
✓ Branch 10 taken 654 times.
✓ Branch 13 taken 654 times.
✓ Branch 16 taken 654 times.
654 body += "DTEND;TZID=Europe/Paris:"+ptimetable_dateTimeToCalendarTime(block.getDate(), block.getEndTime())+"\n";
77
5/5
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
✓ Branch 7 taken 654 times.
✓ Branch 10 taken 654 times.
✓ Branch 13 taken 654 times.
654 body += "SUMMARY:"+platexobj_rawtext(block.getTitle())+"\n";
78
5/5
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
✓ Branch 7 taken 654 times.
✓ Branch 10 taken 654 times.
✓ Branch 13 taken 654 times.
654 body += "LOCATION:"+platexobj_rawtext(block.getLocation())+"\n";
79
5/5
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
✓ Branch 7 taken 654 times.
✓ Branch 10 taken 654 times.
✓ Branch 13 taken 654 times.
654 body += "DESCRIPTION:"+platexobj_rawtext(block.getTitle())+"\\n\n";
80
3/4
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
✓ Branch 6 taken 654 times.
✗ Branch 7 not taken.
654 if(block.getMainUrl() != ""){
81
7/7
✓ Branch 1 taken 654 times.
✓ Branch 4 taken 654 times.
✓ Branch 7 taken 654 times.
✓ Branch 10 taken 654 times.
✓ Branch 13 taken 654 times.
✓ Branch 16 taken 654 times.
✓ Branch 19 taken 654 times.
654 body += " "+block.getMainUrl() + "redirect.html?label=sec_"+block.getInvitation()+"\\n\n";
82 }
83
1/1
✓ Branch 1 taken 654 times.
654 body += "BEGIN:VALARM\n";
84
1/1
✓ Branch 1 taken 654 times.
654 body += "TRIGGER:-PT10M\n";
85
1/1
✓ Branch 1 taken 654 times.
654 body += "ACTION:DISPLAY\n";
86
1/1
✓ Branch 1 taken 654 times.
654 body += "DESCRIPTION:Reminder\n";
87
1/1
✓ Branch 1 taken 654 times.
654 body += "END:VALARM\n";
88
1/1
✓ Branch 1 taken 654 times.
654 body += "END:VEVENT\n";
89
1/1
✓ Branch 1 taken 654 times.
654 return body;
90 654 }
91
92 ///Convert a day into a event calendar
93 /** @param[out] counter : counter of block to make sure UID is unique
94 * @param day : TexDay to be converted
95 * @return corresponding event calendar
96 */
97 135 PString ptimetable_dayToVecEvent(size_t & counter, const TexDay & day){
98 135 PString body("");
99 135 const std::map<PString, PTimeTableBlock> & mapBlock = day.mapBlock;
100
2/2
✓ Branch 3 taken 1152 times.
✓ Branch 4 taken 135 times.
1287 for(std::map<PString, PTimeTableBlock>::const_iterator it(mapBlock.begin()); it != mapBlock.end(); ++it){
101
2/2
✓ Branch 2 taken 1152 times.
✓ Branch 5 taken 1152 times.
1152 body += ptimetable_blockToEvent(counter, it->second);
102 }
103 135 return body;
104 }
105
106 ///Convert a week into a event calendar
107 /** @param[out] counter : counter of block to make sure UID is unique
108 * @param week : TexWeek to be converted
109 * @return corresponding event calendar
110 */
111 16 PString ptimetable_weekToVecEvent(size_t & counter, const TexWeek & week){
112 16 PString body("");
113 16 const std::map<PString, TexDay> & mapDay = week.mapDay;
114
2/2
✓ Branch 3 taken 84 times.
✓ Branch 4 taken 16 times.
100 for(std::map<PString, TexDay>::const_iterator it(mapDay.begin()); it != mapDay.end(); ++it){
115
2/2
✓ Branch 2 taken 84 times.
✓ Branch 5 taken 84 times.
84 body += ptimetable_dayToVecEvent(counter, it->second);
116 }
117 16 return body;
118 }
119
120 ///Convert a timetable into a event calendar
121 /** @param[out] counter : counter of block to make sure UID is unique
122 * @param texTimeTable : TexTimetable to be converted
123 * @return corresponding event calendar
124 */
125 4 PString ptimetable_timetableToVecEvent(size_t & counter, const TexTimetable & texTimeTable){
126 4 PString body("");
127 4 const std::vector<TexWeek> & vecWeek = texTimeTable.vecWeek;
128
2/2
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 4 times.
14 for(std::vector<TexWeek>::const_iterator it(vecWeek.begin()); it != vecWeek.end(); ++it){
129
2/2
✓ Branch 2 taken 10 times.
✓ Branch 5 taken 10 times.
10 body += ptimetable_weekToVecEvent(counter, *it);
130 }
131 4 return body;
132 }
133
134 ///Create an invitation
135 /** @param outputDirectory : output directory where to put all generated invitations
136 * @param timetable : TexTimetable to be used to generate invitations
137 * @return true on success, false otherwise
138 */
139 bool ptimetable_createInvitation(const PPath & outputDirectory, const TexTimetable & timetable){
140 bool b(true);
141 size_t counter(0lu);
142 PString bevt(ptimetable_beginInvitation("PhoenixTex2Html", timetable.invitation)), eevt(ptimetable_endInvitation());
143 b &= outputDirectory.createDirectory();
144 const std::vector<TexWeek> & vecWeek = timetable.vecWeek;
145 for(std::vector<TexWeek>::const_iterator itWeek(vecWeek.begin()); itWeek != vecWeek.end(); ++itWeek){
146 const std::map<PString, TexDay> & mapDay = itWeek->mapDay;
147 for(std::map<PString, TexDay>::const_iterator itDay(mapDay.begin()); itDay != mapDay.end(); ++itDay){
148 const std::map<PString, PTimeTableBlock> & mapBlock = itDay->second.mapBlock;
149 for(std::map<PString, PTimeTableBlock>::const_iterator it(mapBlock.begin()); it != mapBlock.end(); ++it){
150 if(it->second.getInvitation() != ""){
151 b &= PPath(outputDirectory + PPath("/") + it->second.getInvitation() + PPath(".ics")).saveFileContent(
152 bevt+ptimetable_blockToEvent(counter, it->second)+eevt);
153 }
154 }
155 if(itDay->second.invitation != ""){
156 b &= PPath(outputDirectory + PPath("/") + itDay->second.invitation + PPath(".ics")).saveFileContent(
157 bevt+ptimetable_dayToVecEvent(counter, itDay->second)+eevt);
158 }
159 }
160 if(itWeek->invitation != ""){
161 b &= PPath(outputDirectory + PPath("/") + itWeek->invitation + PPath(".ics")).saveFileContent(
162 bevt+ptimetable_weekToVecEvent(counter, *itWeek)+eevt);
163 }
164 }
165 if(timetable.invitation != ""){
166 b &= PPath(outputDirectory + PPath("/") + timetable.invitation + PPath(".ics")).saveFileContent(
167 bevt+ptimetable_timetableToVecEvent(counter, timetable)+eevt);
168 }
169 return b;
170 }
171
172 ///Create invitations for timetable, weeks and days
173 /** @param[out] counter : counter of block to make sure UID is unique
174 * @param outputDirectory : output directory where to put all generated invitations
175 * @param timetable : TexTimetable to be used to generate invitations
176 * @return true on success, false otherwise
177 */
178 4 bool ptimetable_createFullWeekDayInvitation(size_t & counter, const PPath & outputDirectory, const TexTimetable & timetable){
179 4 bool b(true);
180
3/3
✓ Branch 1 taken 4 times.
✓ Branch 4 taken 4 times.
✓ Branch 7 taken 4 times.
8 PString bevt(ptimetable_beginInvitation("PhoenixTex2Html", timetable.invitation)), eevt(ptimetable_endInvitation());
181
1/1
✓ Branch 1 taken 4 times.
4 b &= outputDirectory.createDirectory();
182 4 const std::vector<TexWeek> & vecWeek = timetable.vecWeek;
183
2/2
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 4 times.
14 for(std::vector<TexWeek>::const_iterator itWeek(vecWeek.begin()); itWeek != vecWeek.end(); ++itWeek){
184 10 const std::map<PString, TexDay> & mapDay = itWeek->mapDay;
185
2/2
✓ Branch 4 taken 51 times.
✓ Branch 5 taken 10 times.
61 for(std::map<PString, TexDay>::const_iterator itDay(mapDay.begin()); itDay != mapDay.end(); ++itDay){
186
2/3
✓ Branch 2 taken 51 times.
✓ Branch 4 taken 51 times.
✗ Branch 5 not taken.
51 if(itDay->second.invitation != ""){
187
11/11
✓ Branch 1 taken 51 times.
✓ Branch 4 taken 51 times.
✓ Branch 8 taken 51 times.
✓ Branch 11 taken 51 times.
✓ Branch 14 taken 51 times.
✓ Branch 17 taken 51 times.
✓ Branch 20 taken 51 times.
✓ Branch 23 taken 51 times.
✓ Branch 26 taken 51 times.
✓ Branch 29 taken 51 times.
✓ Branch 32 taken 51 times.
153 b &= PPath(outputDirectory + PPath("/") + itDay->second.invitation + PPath(".ics")).saveFileContent(
188
3/3
✓ Branch 2 taken 51 times.
✓ Branch 5 taken 51 times.
✓ Branch 8 taken 51 times.
102 bevt+ptimetable_dayToVecEvent(counter, itDay->second)+eevt);
189 }
190 }
191
3/3
✓ Branch 2 taken 10 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 4 times.
10 if(itWeek->invitation != ""){
192
11/11
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 8 taken 6 times.
✓ Branch 11 taken 6 times.
✓ Branch 14 taken 6 times.
✓ Branch 17 taken 6 times.
✓ Branch 20 taken 6 times.
✓ Branch 23 taken 6 times.
✓ Branch 26 taken 6 times.
✓ Branch 29 taken 6 times.
✓ Branch 32 taken 6 times.
18 b &= PPath(outputDirectory + PPath("/") + itWeek->invitation + PPath(".ics")).saveFileContent(
193
3/3
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 8 taken 6 times.
12 bevt+ptimetable_weekToVecEvent(counter, *itWeek)+eevt);
194 }
195 }
196
2/3
✓ Branch 1 taken 4 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
4 if(timetable.invitation != ""){
197
11/11
✓ Branch 1 taken 4 times.
✓ Branch 4 taken 4 times.
✓ Branch 7 taken 4 times.
✓ Branch 10 taken 4 times.
✓ Branch 13 taken 4 times.
✓ Branch 16 taken 4 times.
✓ Branch 19 taken 4 times.
✓ Branch 22 taken 4 times.
✓ Branch 25 taken 4 times.
✓ Branch 28 taken 4 times.
✓ Branch 31 taken 4 times.
12 b &= PPath(outputDirectory + PPath("/") + timetable.invitation + PPath(".ics")).saveFileContent(
198
3/3
✓ Branch 1 taken 4 times.
✓ Branch 4 taken 4 times.
✓ Branch 7 taken 4 times.
8 bevt+ptimetable_timetableToVecEvent(counter, timetable)+eevt);
199 }
200 4 return b;
201 4 }
202
203 ///Create the map of invitation blocks
204 /** @param[out] mapInviteVecBlock : map of vector of blocks sorted by invitation
205 * @param timetable : TexTimetable to be used to generate invitations
206 */
207 4 void ptimetable_createMapInviteBlock(std::map<PString, std::vector<PTimeTableBlock> > & mapInviteVecBlock, const TexTimetable & timetable){
208 4 const std::vector<TexWeek> & vecWeek = timetable.vecWeek;
209
2/2
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 4 times.
14 for(std::vector<TexWeek>::const_iterator itWeek(vecWeek.begin()); itWeek != vecWeek.end(); ++itWeek){
210 10 const std::map<PString, TexDay> & mapDay = itWeek->mapDay;
211
2/2
✓ Branch 4 taken 51 times.
✓ Branch 5 taken 10 times.
61 for(std::map<PString, TexDay>::const_iterator itDay(mapDay.begin()); itDay != mapDay.end(); ++itDay){
212 51 const std::map<PString, PTimeTableBlock> & mapBlock = itDay->second.mapBlock;
213
2/2
✓ Branch 4 taken 396 times.
✓ Branch 5 taken 51 times.
447 for(std::map<PString, PTimeTableBlock>::const_iterator it(mapBlock.begin()); it != mapBlock.end(); ++it){
214
4/4
✓ Branch 2 taken 396 times.
✓ Branch 5 taken 396 times.
✓ Branch 7 taken 171 times.
✓ Branch 8 taken 225 times.
396 if(it->second.getInvitation() != ""){
215
3/3
✓ Branch 2 taken 171 times.
✓ Branch 5 taken 171 times.
✓ Branch 9 taken 171 times.
171 mapInviteVecBlock[it->second.getInvitation()].push_back(it->second);
216 }
217 }
218 }
219 }
220 4 }
221
222 ///Create the map of invitation blocks
223 /** @param[out] counter : counter of block to make sure UID is unique
224 * @param outputDirectory : output directory where to put all generated invitations
225 * @param mapInviteVecBlock : map of vector of blocks sorted by invitation to be saved
226 * @param bevt : begining of invitations
227 * @param eevt : anding of invitations
228 * @return true on success, false otherwise
229 */
230 4 bool ptimetable_saveMapInviteBlock(size_t & counter, const PPath & outputDirectory,
231 const std::map<PString, std::vector<PTimeTableBlock> > & mapInviteVecBlock,
232 const PString & bevt, const PString & eevt)
233 {
234 4 bool b(true);
235
2/2
✓ Branch 4 taken 111 times.
✓ Branch 5 taken 4 times.
115 for(std::map<PString, std::vector<PTimeTableBlock> >::const_iterator itInvite(mapInviteVecBlock.begin()); itInvite != mapInviteVecBlock.end(); ++itInvite){
236
1/1
✓ Branch 1 taken 111 times.
111 PString fullInvitation(bevt);
237 111 const std::vector<PTimeTableBlock> & vecBlock = itInvite->second;
238
2/2
✓ Branch 3 taken 171 times.
✓ Branch 4 taken 111 times.
282 for(std::vector<PTimeTableBlock>::const_iterator it(vecBlock.begin()); it != vecBlock.end(); ++it){
239
2/2
✓ Branch 2 taken 171 times.
✓ Branch 5 taken 171 times.
171 fullInvitation += ptimetable_blockToEvent(counter, *it);
240 }
241
1/1
✓ Branch 1 taken 111 times.
111 fullInvitation += eevt;
242
9/9
✓ Branch 1 taken 111 times.
✓ Branch 4 taken 111 times.
✓ Branch 8 taken 111 times.
✓ Branch 11 taken 111 times.
✓ Branch 14 taken 111 times.
✓ Branch 17 taken 111 times.
✓ Branch 20 taken 111 times.
✓ Branch 23 taken 111 times.
✓ Branch 26 taken 111 times.
222 PPath outputFile(outputDirectory + PPath("/") + itInvite->first + PPath(".ics"));
243
1/1
✓ Branch 1 taken 111 times.
111 b &= outputFile.saveFileContent(fullInvitation);
244 111 }
245 4 return b;
246 }
247
248 ///Create invitations but merge blocks with the same invitation
249 /** @param outputDirectory : output directory where to put all generated invitations
250 * @param timetable : TexTimetable to be used to generate invitations
251 * @return true on success, false otherwise
252 */
253 4 bool ptimetable_createInvitationMergBlock(const PPath & outputDirectory, const TexTimetable & timetable){
254 4 std::map<PString, std::vector<PTimeTableBlock>> mapInviteVecBlock;
255
1/1
✓ Branch 1 taken 4 times.
4 ptimetable_createMapInviteBlock(mapInviteVecBlock, timetable);
256
257 4 bool b(true);
258
3/3
✓ Branch 1 taken 4 times.
✓ Branch 4 taken 4 times.
✓ Branch 7 taken 4 times.
8 PString bevt(ptimetable_beginInvitation("PhoenixTex2Html", timetable.invitation)), eevt(ptimetable_endInvitation());
259
1/1
✓ Branch 1 taken 4 times.
4 b &= outputDirectory.createDirectory();
260 4 size_t counter(0lu);
261
1/1
✓ Branch 1 taken 4 times.
4 b &= ptimetable_saveMapInviteBlock(counter, outputDirectory, mapInviteVecBlock, bevt, eevt);
262
1/1
✓ Branch 1 taken 4 times.
4 b &= ptimetable_createFullWeekDayInvitation(counter, outputDirectory, timetable);
263 4 return b;
264 4 }
265
266
267