added XML-RPC method removeFromSchedule to SchedulerDaemon

This commit is contained in:
maroy 2004-08-01 06:22:37 +00:00
parent 0b445bac8a
commit eebd0acc87
22 changed files with 1823 additions and 696 deletions

View File

@ -7,449 +7,447 @@
<g>
<defs id="defs1">
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
<path d="M10 10 L10 321 L606 321 L606 10 Z" />
<path d="M10 10 L10 311 L596 311 L596 10 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
<path d="M0 0 L0 311 L596 311 L596 0 Z" />
<path d="M0 0 L0 301 L586 301 L586 0 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath3">
<path d="M-480 -10 L-480 301 L116 301 L116 -10 Z" />
<path d="M-10 -10 L-10 291 L576 291 L576 -10 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath4">
<path d="M-486 -16 L-486 295 L110 295 L110 -16 Z" />
<path d="M-16 -16 L-16 285 L570 285 L570 -16 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath5">
<path d="M-523.47412109375 -16 L-523.47412109375 295 L72.5259017944336 295 L72.5259017944336 -16 Z" />
<path d="M-85.44290161132812 -16 L-85.44290161132812 285 L500.5570983886719 285 L500.5570983886719 -16 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6">
<path d="M-526.95458984375 -16 L-526.95458984375 295 L69.04540252685547 295 L69.04540252685547 -16 Z" />
<path d="M-88.92330169677734 -16 L-88.92330169677734 285 L497.0766906738281 285 L497.0766906738281 -16 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath7">
<path d="M-527.513671875 -71 L-527.513671875 240 L68.48629760742188 240 L68.48629760742188 -71 Z" />
<path d="M-470 -10 L-470 291 L116 291 L116 -10 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath8">
<path d="M-10 -10 L-10 301 L586 301 L586 -10 Z" />
<path d="M-476 -16 L-476 285 L110 285 L110 -16 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath9">
<path d="M-16 -16 L-16 295 L580 295 L580 -16 Z" />
<path d="M-513.47412109375 -16 L-513.47412109375 285 L72.5259017944336 285 L72.5259017944336 -16 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath10">
<path d="M-85.44290161132812 -16 L-85.44290161132812 295 L510.5570983886719 295 L510.5570983886719 -16 Z" />
<path d="M-516.95458984375 -16 L-516.95458984375 285 L69.04540252685547 285 L69.04540252685547 -16 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath11">
<path d="M-88.92330169677734 -16 L-88.92330169677734 295 L507.0766906738281 295 L507.0766906738281 -16 Z" />
<path d="M-517.513671875 -71 L-517.513671875 230 L68.48629760742188 230 L68.48629760742188 -71 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath12">
<path d="M527.513671875 71 L527.513671875 -240 L-68.48629760742188 -240 L-68.48629760742188 71 Z" />
<path d="M517.513671875 71 L517.513671875 -230 L-68.48629760742188 -230 L-68.48629760742188 71 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath13">
<path d="M-199.79840087890625 -47 L-199.79840087890625 264 L396.20159912109375 264 L396.20159912109375 -47 Z" />
<path d="M-194.79840087890625 -47 L-194.79840087890625 254 L391.20159912109375 254 L391.20159912109375 -47 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath14">
<path d="M-205.27890014648438 -47 L-205.27890014648438 264 L390.7210998535156 264 L390.7210998535156 -47 Z" />
<path d="M-200.27890014648438 -47 L-200.27890014648438 254 L385.7210998535156 254 L385.7210998535156 -47 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath15">
<path d="M-210.75929260253906 -47 L-210.75929260253906 264 L385.2406921386719 264 L385.2406921386719 -47 Z" />
<path d="M-205.75929260253906 -47 L-205.75929260253906 254 L380.2406921386719 254 L380.2406921386719 -47 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath16">
<path d="M-283.7255859375 -47 L-283.7255859375 264 L312.2744140625 264 L312.2744140625 -47 Z" />
<path d="M-278.7255859375 -47 L-278.7255859375 254 L307.2744140625 254 L307.2744140625 -47 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath17">
<path d="M-295.9501953125 -47 L-295.9501953125 264 L300.0498046875 264 L300.0498046875 -47 Z" />
<path d="M-290.9501953125 -47 L-290.9501953125 254 L295.0498046875 254 L295.0498046875 -47 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath18">
<path d="M-361.9931945800781 -47 L-361.9931945800781 264 L234.00680541992188 264 L234.00680541992188 -47 Z" />
<path d="M-356.9931945800781 -47 L-356.9931945800781 254 L229.00680541992188 254 L229.00680541992188 -47 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath19">
<path d="M-365.5703125 -47 L-365.5703125 264 L230.42970275878906 264 L230.42970275878906 -47 Z" />
<path d="M-360.5703125 -47 L-360.5703125 254 L225.42970275878906 254 L225.42970275878906 -47 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath20">
<path d="M-410.2095031738281 -47 L-410.2095031738281 264 L185.79049682617188 264 L185.79049682617188 -47 Z" />
<path d="M-405.2095031738281 -47 L-405.2095031738281 254 L180.79049682617188 254 L180.79049682617188 -47 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath21">
<path d="M527.513671875 106 L527.513671875 -205 L-68.48629760742188 -205 L-68.48629760742188 106 Z" />
<path d="M517.513671875 106 L517.513671875 -195 L-68.48629760742188 -195 L-68.48629760742188 106 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath22">
<path d="M-190.33450317382812 -82 L-190.33450317382812 229 L405.6654968261719 229 L405.6654968261719 -82 Z" />
<path d="M-182.27029418945312 -82 L-182.27029418945312 219 L403.7297058105469 219 L403.7297058105469 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath23">
<path d="M-195.81500244140625 -82 L-195.81500244140625 229 L400.18499755859375 229 L400.18499755859375 -82 Z" />
<path d="M-187.75079345703125 -82 L-187.75079345703125 219 L398.24920654296875 219 L398.24920654296875 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath24">
<path d="M-201.29539489746094 -82 L-201.29539489746094 229 L394.70458984375 229 L394.70458984375 -82 Z" />
<path d="M-193.231201171875 -82 L-193.231201171875 219 L392.768798828125 219 L392.768798828125 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath25">
<path d="M-278.7412109375 -82 L-278.7412109375 229 L317.2587890625 229 L317.2587890625 -82 Z" />
<path d="M-276.8053894042969 -82 L-276.8053894042969 219 L309.1946105957031 219 L309.1946105957031 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath26">
<path d="M-290.9657897949219 -82 L-290.9657897949219 229 L305.0342102050781 229 L305.0342102050781 -82 Z" />
<path d="M-289.0299987792969 -82 L-289.0299987792969 219 L296.9700012207031 219 L296.9700012207031 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath27">
<path d="M-376.17279052734375 -82 L-376.17279052734375 229 L219.8271942138672 229 L219.8271942138672 -82 Z" />
<path d="M-374.2370910644531 -82 L-374.2370910644531 219 L211.7628936767578 219 L211.7628936767578 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath28">
<path d="M-379.75 -82 L-379.75 229 L216.25 229 L216.25 -82 Z" />
<path d="M-377.814208984375 -82 L-377.814208984375 219 L208.18580627441406 219 L208.18580627441406 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath29">
<path d="M-405.3218078613281 -82 L-405.3218078613281 229 L190.67820739746094 229 L190.67820739746094 -82 Z" />
<path d="M-403.385986328125 -82 L-403.385986328125 219 L182.61399841308594 219 L182.61399841308594 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath30">
<path d="M-408.80218505859375 -82 L-408.80218505859375 229 L187.1977996826172 229 L187.1977996826172 -82 Z" />
<path d="M-406.8664855957031 -82 L-406.8664855957031 219 L179.1334991455078 219 L179.1334991455078 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath31">
<path d="M-419.6733093261719 -82 L-419.6733093261719 229 L176.3267059326172 229 L176.3267059326172 -82 Z" />
<path d="M-417.73748779296875 -82 L-417.73748779296875 219 L168.2624969482422 219 L168.2624969482422 -82 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath32">
<path d="M527.513671875 141 L527.513671875 -170 L-68.48629760742188 -170 L-68.48629760742188 141 Z" />
<path d="M517.513671875 141 L517.513671875 -160 L-68.48629760742188 -160 L-68.48629760742188 141 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath33">
<path d="M-211.1717071533203 -117 L-211.1717071533203 194 L384.82830810546875 194 L384.82830810546875 -117 Z" />
<path d="M-206.1717071533203 -117 L-206.1717071533203 184 L379.82830810546875 184 L379.82830810546875 -117 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath34">
<path d="M-216.65220642089844 -117 L-216.65220642089844 194 L379.3478088378906 194 L379.3478088378906 -117 Z" />
<path d="M-211.65220642089844 -117 L-211.65220642089844 184 L374.3478088378906 184 L374.3478088378906 -117 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath35">
<path d="M-222.13259887695312 -117 L-222.13259887695312 194 L373.8674011230469 194 L373.8674011230469 -117 Z" />
<path d="M-217.13259887695312 -117 L-217.13259887695312 184 L368.8674011230469 184 L368.8674011230469 -117 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath36">
<path d="M-260.13848876953125 -117 L-260.13848876953125 194 L335.86151123046875 194 L335.86151123046875 -117 Z" />
<path d="M-255.1385040283203 -117 L-255.1385040283203 184 L330.86151123046875 184 L330.86151123046875 -117 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath37">
<path d="M-272.36309814453125 -117 L-272.36309814453125 194 L323.63690185546875 194 L323.63690185546875 -117 Z" />
<path d="M-267.36309814453125 -117 L-267.36309814453125 184 L318.63690185546875 184 L318.63690185546875 -117 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath38">
<path d="M-347.160888671875 -117 L-347.160888671875 194 L248.83909606933594 194 L248.83909606933594 -117 Z" />
<path d="M-342.160888671875 -117 L-342.160888671875 184 L243.83909606933594 184 L243.83909606933594 -117 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath39">
<path d="M-350.73809814453125 -117 L-350.73809814453125 194 L245.26190185546875 194 L245.26190185546875 -117 Z" />
<path d="M-345.73809814453125 -117 L-345.73809814453125 184 L240.26190185546875 184 L240.26190185546875 -117 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath40">
<path d="M-398.8362121582031 -117 L-398.8362121582031 194 L197.16380310058594 194 L197.16380310058594 -117 Z" />
<path d="M-393.8362121582031 -117 L-393.8362121582031 184 L192.16380310058594 184 L192.16380310058594 -117 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath41">
<path d="M527.513671875 176 L527.513671875 -135 L-68.48629760742188 -135 L-68.48629760742188 176 Z" />
<path d="M517.513671875 176 L517.513671875 -125 L-68.48629760742188 -125 L-68.48629760742188 176 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath42">
<path d="M-182.5518035888672 -152 L-182.5518035888672 159 L413.4482116699219 159 L413.4482116699219 -152 Z" />
<path d="M-164.61819458007812 -152 L-164.61819458007812 149 L421.3818054199219 149 L421.3818054199219 -152 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath43">
<path d="M-188.0323028564453 -152 L-188.0323028564453 159 L407.96771240234375 159 L407.96771240234375 -152 Z" />
<path d="M-170.09869384765625 -152 L-170.09869384765625 149 L415.90130615234375 149 L415.90130615234375 -152 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath44">
<path d="M-193.5126953125 -152 L-193.5126953125 159 L402.4873046875 159 L402.4873046875 -152 Z" />
<path d="M-175.5791015625 -152 L-175.5791015625 149 L410.4208984375 149 L410.4208984375 -152 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath45">
<path d="M-307.9867858886719 -152 L-307.9867858886719 159 L288.0132141113281 159 L288.0132141113281 -152 Z" />
<path d="M-233.22169494628906 -152 L-233.22169494628906 149 L352.7782897949219 149 L352.7782897949219 -152 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath46">
<path d="M-311.5639953613281 -152 L-311.5639953613281 159 L284.4360046386719 159 L284.4360046386719 -152 Z" />
<path d="M-245.44630432128906 -152 L-245.44630432128906 149 L340.5537109375 149 L340.5537109375 -152 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath47">
<path d="M-385.9696960449219 -152 L-385.9696960449219 159 L210.03030395507812 159 L210.03030395507812 -152 Z" />
<path d="M-359.92041015625 -152 L-359.92041015625 149 L226.07960510253906 149 L226.07960510253906 -152 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath48">
<path d="M-389.4501953125 -152 L-389.4501953125 159 L206.5498046875 159 L206.5498046875 -152 Z" />
<path d="M-363.4975891113281 -152 L-363.4975891113281 149 L222.5023956298828 149 L222.5023956298828 -152 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath49">
<path d="M-427.4560852050781 -152 L-427.4560852050781 159 L168.5438995361328 159 L168.5438995361328 -152 Z" />
<path d="M-437.9032897949219 -152 L-437.9032897949219 149 L148.09669494628906 149 L148.09669494628906 -152 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath50">
<path d="M527.513671875 211 L527.513671875 -100 L-68.48629760742188 -100 L-68.48629760742188 211 Z" />
<path d="M517.513671875 211 L517.513671875 -90 L-68.48629760742188 -90 L-68.48629760742188 211 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath51">
<path d="M-176.00439453125 -187 L-176.00439453125 124 L419.99560546875 124 L419.99560546875 -187 Z" />
<path d="M-191.7476043701172 -187 L-191.7476043701172 114 L394.2524108886719 114 L394.2524108886719 -187 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath52">
<path d="M-181.48489379882812 -187 L-181.48489379882812 124 L414.5151062011719 124 L414.5151062011719 -187 Z" />
<path d="M-197.2281036376953 -187 L-197.2281036376953 114 L388.77191162109375 114 L388.77191162109375 -187 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath53">
<path d="M-186.96530151367188 -187 L-186.96530151367188 124 L409.0346984863281 124 L409.0346984863281 -187 Z" />
<path d="M-202.70849609375 -187 L-202.70849609375 114 L383.29150390625 114 L383.29150390625 -187 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath54">
<path d="M-244.84959411621094 -187 L-244.84959411621094 124 L351.150390625 124 L351.150390625 -187 Z" />
<path d="M-260.5928039550781 -187 L-260.5928039550781 114 L325.4071960449219 114 L325.4071960449219 -187 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath55">
<path d="M-248.42669677734375 -187 L-248.42669677734375 124 L347.57330322265625 124 L347.57330322265625 -187 Z" />
<path d="M-264.1698913574219 -187 L-264.1698913574219 114 L321.8301086425781 114 L321.8301086425781 -187 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath56">
<path d="M-322.8324890136719 -187 L-322.8324890136719 124 L273.1675109863281 124 L273.1675109863281 -187 Z" />
<path d="M-338.5757141113281 -187 L-338.5757141113281 114 L247.42430114746094 114 L247.42430114746094 -187 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath57">
<path d="M-326.31298828125 -187 L-326.31298828125 124 L269.68701171875 124 L269.68701171875 -187 Z" />
<path d="M-342.05621337890625 -187 L-342.05621337890625 114 L243.9438018798828 114 L243.9438018798828 -187 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath58">
<path d="M-364.31878662109375 -187 L-364.31878662109375 124 L231.6811981201172 124 L231.6811981201172 -187 Z" />
<path d="M-408.26031494140625 -187 L-408.26031494140625 114 L177.7397003173828 114 L177.7397003173828 -187 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath59">
<path d="M-367.7992858886719 -187 L-367.7992858886719 124 L228.20069885253906 124 L228.20069885253906 -187 Z" />
<path d="M517.513671875 246 L517.513671875 -55 L-68.48629760742188 -55 L-68.48629760742188 246 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath60">
<path d="M-434.0033874511719 -187 L-434.0033874511719 124 L161.99659729003906 124 L161.99659729003906 -187 Z" />
<path d="M-182.27029418945312 -222 L-182.27029418945312 79 L403.7297058105469 79 L403.7297058105469 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath61">
<path d="M527.513671875 246 L527.513671875 -65 L-68.48629760742188 -65 L-68.48629760742188 246 Z" />
<path d="M-187.75079345703125 -222 L-187.75079345703125 79 L398.24920654296875 79 L398.24920654296875 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath62">
<path d="M-187.27029418945312 -222 L-187.27029418945312 89 L408.7297058105469 89 L408.7297058105469 -222 Z" />
<path d="M-193.231201171875 -222 L-193.231201171875 79 L392.768798828125 79 L392.768798828125 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath63">
<path d="M-192.75079345703125 -222 L-192.75079345703125 89 L403.24920654296875 89 L403.24920654296875 -222 Z" />
<path d="M-276.8053894042969 -222 L-276.8053894042969 79 L309.1946105957031 79 L309.1946105957031 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath64">
<path d="M-198.231201171875 -222 L-198.231201171875 89 L397.768798828125 89 L397.768798828125 -222 Z" />
<path d="M-289.0299987792969 -222 L-289.0299987792969 79 L296.9700012207031 79 L296.9700012207031 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath65">
<path d="M-281.8053894042969 -222 L-281.8053894042969 89 L314.1946105957031 89 L314.1946105957031 -222 Z" />
<path d="M-374.2370910644531 -222 L-374.2370910644531 79 L211.7628936767578 79 L211.7628936767578 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath66">
<path d="M-294.0299987792969 -222 L-294.0299987792969 89 L301.9700012207031 89 L301.9700012207031 -222 Z" />
<path d="M-377.814208984375 -222 L-377.814208984375 79 L208.18580627441406 79 L208.18580627441406 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath67">
<path d="M-379.2370910644531 -222 L-379.2370910644531 89 L216.7628936767578 89 L216.7628936767578 -222 Z" />
<path d="M-403.385986328125 -222 L-403.385986328125 79 L182.61399841308594 79 L182.61399841308594 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath68">
<path d="M-382.814208984375 -222 L-382.814208984375 89 L213.18580627441406 89 L213.18580627441406 -222 Z" />
<path d="M-406.8664855957031 -222 L-406.8664855957031 79 L179.1334991455078 79 L179.1334991455078 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath69">
<path d="M-408.385986328125 -222 L-408.385986328125 89 L187.61399841308594 89 L187.61399841308594 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath70">
<path d="M-411.8664855957031 -222 L-411.8664855957031 89 L184.1334991455078 89 L184.1334991455078 -222 Z" />
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath71">
<path d="M-422.73748779296875 -222 L-422.73748779296875 89 L173.2624969482422 89 L173.2624969482422 -222 Z" />
<path d="M-417.73748779296875 -222 L-417.73748779296875 79 L168.2624969482422 79 L168.2624969482422 -222 Z" />
</clipPath>
</defs>
<g color-rendering="optimizeQuality" stroke-dasharray="5,5" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,480,10)">
<path d="M53.013648986816406 0.5 L53.013648986816406 290.5" clip-path="url(#clipPath3)" fill="none" />
<path d="M0.5 0.5 L104.52729797363281 0.5 L104.52729797363281 25.5 L0.5 25.5 Z" stroke="none" clip-path="url(#clipPath3)" fill="white" />
<path d="M0.5 0.5 L104.52729797363281 0.5 L104.52729797363281 25.5 L0.5 25.5 Z" stroke-dasharray="none" clip-path="url(#clipPath3)" fill="none" />
<g color-rendering="optimizeQuality" stroke-dasharray="5,5" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,10,10)">
<path d="M79.08495330810547 0.5 L79.08495330810547 280.5" clip-path="url(#clipPath3)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,486,16)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath4)">system</text>
<line x1="0" y1="12.5" x2="37.47412109375" y2="12.5" clip-path="url(#clipPath4)" fill="none" />
<g color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke="white" fill="white" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,10,10)">
<path d="M0.5 0.5 L156.66990661621094 0.5 L156.66990661621094 25.5 L0.5 25.5 Z" stroke="none" clip-path="url(#clipPath3)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,523.4741,16)">
<g color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,10,10)">
<path d="M0.5 0.5 L156.66990661621094 0.5 L156.66990661621094 25.5 L0.5 25.5 Z" clip-path="url(#clipPath3)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,16,16)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath4)">playlistEditor</text>
<line x1="0" y1="12.5" x2="69.44287109375" y2="12.5" clip-path="url(#clipPath4)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,85.4429,16)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath5)">:</text>
<line x1="0" y1="12.5" x2="3.48046875" y2="12.5" clip-path="url(#clipPath5)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,526.9546,16)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath6)">Scheduler</text>
<line x1="0" y1="12.5" x2="52.07275390625" y2="12.5" clip-path="url(#clipPath6)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke="white" fill="white" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,527.5137,71)">
<path d="M0.5 0.5 L9.5 0.5 L9.5 229.5 L0.5 229.5 Z" stroke="none" clip-path="url(#clipPath7)" />
<path d="M0.5 0.5 L9.5 0.5 L9.5 229.5 L0.5 229.5 Z" stroke="black" clip-path="url(#clipPath7)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke="white" fill="white" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,10,10)">
<path d="M79.08495330810547 0.5 L79.08495330810547 290.5" stroke="none" clip-path="url(#clipPath8)" />
<path d="M79.08495330810547 0.5 L79.08495330810547 290.5" stroke-dasharray="5,5" stroke="black" clip-path="url(#clipPath8)" fill="none" />
<path d="M0.5 0.5 L156.66990661621094 0.5 L156.66990661621094 25.5 L0.5 25.5 Z" stroke-dasharray="5,5" stroke="none" clip-path="url(#clipPath8)" />
<path d="M0.5 0.5 L156.66990661621094 0.5 L156.66990661621094 25.5 L0.5 25.5 Z" stroke="black" clip-path="url(#clipPath8)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,16,16)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath9)">playlistEditor</text>
<line x1="0" y1="12.5" x2="69.44287109375" y2="12.5" clip-path="url(#clipPath9)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,85.4429,16)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath10)">:</text>
<line x1="0" y1="12.5" x2="3.48046875" y2="12.5" clip-path="url(#clipPath10)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,88.9233,16)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath11)">Playlist editor</text>
<line x1="0" y1="12.5" x2="72.24658203125" y2="12.5" clip-path="url(#clipPath11)" fill="none" />
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath6)">Playlist editor</text>
<line x1="0" y1="12.5" x2="72.24658203125" y2="12.5" clip-path="url(#clipPath6)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke="white" fill="white" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,470,10)">
<path d="M53.013648986816406 0.5 L53.013648986816406 280.5" stroke="none" clip-path="url(#clipPath7)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-dasharray="5,5" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,470,10)">
<path d="M53.013648986816406 0.5 L53.013648986816406 280.5" clip-path="url(#clipPath7)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke="white" fill="white" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,470,10)">
<path d="M0.5 0.5 L104.52729797363281 0.5 L104.52729797363281 25.5 L0.5 25.5 Z" stroke="none" clip-path="url(#clipPath7)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,470,10)">
<path d="M0.5 0.5 L104.52729797363281 0.5 L104.52729797363281 25.5 L0.5 25.5 Z" clip-path="url(#clipPath7)" fill="none" />
<text x="0" y="11" xml:space="preserve" stroke-miterlimit="10" stroke="none" clip-path="url(#clipPath8)" stroke-linecap="square" transform="matrix(1,0,0,1,6,6)">system</text>
<line x1="0" y1="12.5" x2="37.47412109375" y2="12.5" stroke-miterlimit="10" clip-path="url(#clipPath8)" fill="none" stroke-linecap="square" transform="matrix(1,0,0,1,6,6)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,513.4741,16)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath9)">:</text>
<line x1="0" y1="12.5" x2="3.48046875" y2="12.5" clip-path="url(#clipPath9)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,516.9546,16)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath10)">Scheduler</text>
<line x1="0" y1="12.5" x2="52.07275390625" y2="12.5" clip-path="url(#clipPath10)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke="white" fill="white" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,517.5137,71)">
<path d="M0.5 0.5 L9.5 0.5 L9.5 219.5 L0.5 219.5 Z" stroke="none" clip-path="url(#clipPath11)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,517.5137,71)">
<path d="M0.5 0.5 L9.5 0.5 L9.5 219.5 L0.5 219.5 Z" clip-path="url(#clipPath11)" fill="none" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,-10,-10)">
<path d="M98.58499908447266 81 L537.513671875 81" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke="none" clip-path="url(#clipPath12)" transform="matrix(-1,-4.163336342344337E-15,4.163336342344337E-15,-1,537.5137,81)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath12)" fill="none" stroke-linecap="square" transform="matrix(-1,-4.163336342344337E-15,4.163336342344337E-15,-1,537.5137,81)" />
<path d="M98.58499908447266 81 L527.513671875 81" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" stroke="none" clip-path="url(#clipPath12)" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,81)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath12)" fill="none" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,81)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,199.7984,47)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,194.7984,47)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath13)"> </text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,205.2789,47)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,200.2789,47)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath14)">:</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,210.7593,47)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,205.7593,47)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath15)">authenticated</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,283.7256,47)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,278.7256,47)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath16)">:=</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,295.9502,47)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,290.9502,47)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath17)">authenticate</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,361.9932,47)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,356.9932,47)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath18)">(</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,365.5703,47)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,360.5703,47)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath19)">authInfo</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,410.2095,47)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,405.2095,47)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath20)">)</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,-10,-10)">
<path d="M98.58499908447266 116 L537.513671875 116" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke="none" clip-path="url(#clipPath21)" transform="matrix(-1,-5.10702591327572E-15,5.10702591327572E-15,-1,537.5137,116)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath21)" fill="none" stroke-linecap="square" transform="matrix(-1,-5.10702591327572E-15,5.10702591327572E-15,-1,537.5137,116)" />
<path d="M98.58499908447266 116 L527.513671875 116" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" stroke="none" clip-path="url(#clipPath21)" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,116)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath21)" fill="none" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,116)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,190.3345,82)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,182.2703,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath22)"> </text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,195.815,82)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,187.7508,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath23)">:</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,201.2954,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath24)">schedulEntries</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,193.2312,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath24)">scheduleEntries</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,278.7412,82)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,276.8054,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath25)">:=</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,290.9658,82)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,289.03,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath26)">displaySchedule</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,376.1728,82)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,374.2371,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath27)">(</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,379.75,82)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,377.8142,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath28)">from</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,405.3218,82)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,403.38599999999997,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath29)">,</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,408.80219999999997,82)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,406.8665,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath30)">to</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,419.67330000000004,82)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,417.7375,82)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath31)">)</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,-10,-10)">
<path d="M98.58499908447266 151 L537.513671875 151" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke="none" clip-path="url(#clipPath32)" transform="matrix(-1,-1.1102230246251565E-16,1.1102230246251565E-16,-1,537.5137,151)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath32)" fill="none" stroke-linecap="square" transform="matrix(-1,-1.1102230246251565E-16,1.1102230246251565E-16,-1,537.5137,151)" />
<path d="M98.58499908447266 151 L527.513671875 151" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" stroke="none" clip-path="url(#clipPath32)" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,151)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath32)" fill="none" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,151)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,211.1717,117)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,206.1717,117)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath33)"> </text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,216.6522,117)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,211.6522,117)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath34)">:</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,222.1326,117)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,217.1326,117)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath35)">playlist</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,260.1385,117)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,255.1385,117)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath36)">:=</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,272.3631,117)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,267.3631,117)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath37)">displayPlaylist</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,347.16089999999997,117)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,342.16089999999997,117)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath38)">(</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,350.73810000000003,117)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,345.73810000000003,117)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath39)">playlistId</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,398.83619999999996,117)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,393.83619999999996,117)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath40)">)</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,-10,-10)">
<path d="M98.58499908447266 186 L537.513671875 186" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke="none" clip-path="url(#clipPath41)" transform="matrix(-1,1.1879386363489175E-14,-1.1879386363489175E-14,-1,537.5137,186)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath41)" fill="none" stroke-linecap="square" transform="matrix(-1,1.1879386363489175E-14,-1.1879386363489175E-14,-1,537.5137,186)" />
<path d="M98.58499908447266 186 L527.513671875 186" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" stroke="none" clip-path="url(#clipPath41)" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,186)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath41)" fill="none" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,186)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,182.5518,152)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,164.6182,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath42)"> </text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,188.0323,152)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,170.0987,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath43)">:</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,193.5127,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath44)">removeFromSchedule</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,175.5791,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath44)">isRemoved</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,307.9868,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath45)">(</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,233.2217,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath45)">:=</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,311.56399999999996,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath46)">scheduleEntry</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,245.4463,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath46)">removeFromSchedule</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,385.9697,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath47)">,</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,359.9204,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath47)">(</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,389.4502,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath48)">playlist</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,363.49760000000003,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath48)">scheduleEntry</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,427.4561,152)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,437.90330000000006,152)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath49)">)</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,-10,-10)">
<path d="M98.58499908447266 221 L537.513671875 221" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke="none" clip-path="url(#clipPath50)" transform="matrix(-1,-9.048317650695026E-15,9.048317650695026E-15,-1,537.5137,221)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath50)" fill="none" stroke-linecap="square" transform="matrix(-1,-9.048317650695026E-15,9.048317650695026E-15,-1,537.5137,221)" />
<path d="M98.58499908447266 221 L527.513671875 221" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" stroke="none" clip-path="url(#clipPath50)" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,221)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath50)" fill="none" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,221)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,176.0044,187)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,191.7476,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath51)"> </text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,181.4849,187)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,197.2281,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath52)">:</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,186.9653,187)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,202.70850000000002,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath53)">reschedule</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,244.8496,187)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,260.5928,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath54)">(</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,248.4267,187)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,264.1699,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath55)">scheduleEntry</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,322.8325,187)">
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,338.5757,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath56)">,</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,326.313,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath57)">playlist</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,342.0562,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath57)">newPlaytime</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,364.3188,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath58)">,</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,367.7993,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath59)">newPlaytime</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,434.0034,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath60)">)</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,408.26030000000003,187)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath58)">)</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" stroke-miterlimit="1" color-interpolation="linearRGB" text-rendering="optimizeLegibility" stroke-linecap="butt" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,-10,-10)">
<path d="M98.58499908447266 256 L537.513671875 256" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke="none" clip-path="url(#clipPath61)" transform="matrix(-1,1.1268763699945339E-14,-1.1268763699945339E-14,-1,537.5137,256)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath61)" fill="none" stroke-linecap="square" transform="matrix(-1,1.1268763699945339E-14,-1.1268763699945339E-14,-1,537.5137,256)" />
<path d="M98.58499908447266 256 L527.513671875 256" clip-path="url(#clipPath1)" fill="none" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" stroke="none" clip-path="url(#clipPath59)" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,256)" />
<path d="M12 -6 L0 0 L12 6 Z" stroke-miterlimit="10" clip-path="url(#clipPath59)" fill="none" stroke-linecap="square" transform="matrix(-1,0,0,-1,527.5137,256)" />
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,187.2703,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath62)"> </text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,182.2703,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath60)"> </text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,192.7508,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath63)">:</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,187.7508,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath61)">:</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,198.2312,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath64)">scheduleEntries</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,193.2312,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath62)">scheduleEntries</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,281.8054,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath65)">:=</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,276.8054,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath63)">:=</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,294.03,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath66)">displaySchedule</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,289.03,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath64)">displaySchedule</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,379.2371,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath67)">(</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,374.2371,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath65)">(</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,382.8142,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath68)">from</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,377.8142,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath66)">from</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,408.38599999999997,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath69)">,</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,403.38599999999997,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath67)">,</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,411.8665,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath70)">to</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,406.8665,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath68)">to</text>
</g>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,422.7375,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath71)">)</text>
<g font-family="sans-serif" font-size="11" color-rendering="optimizeQuality" color-interpolation="linearRGB" text-rendering="optimizeLegibility" shape-rendering="geometricPrecision" image-rendering="optimizeQuality" transform="matrix(1,0,0,1,417.7375,222)">
<text x="0" y="11" xml:space="preserve" stroke="none" clip-path="url(#clipPath69)">)</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 44 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 120 KiB

View File

@ -14,8 +14,9 @@ Development Loan Fund</a>, under the GNU <a
href="http://www.gnu.org/licenses/gpl.html">GPL</a>.<br>
<ul>
<li>Author: $Author: maroy $</li>
<li>Version: $Revision: 1.1 $</li>
<li>Location: $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/doc/model/Scheduler/index.html,v $</li>
<li>Version: $Revision: 1.2 $</li>
<li>Location: $Source:
/home/cvs/livesupport/doc/model/Scheduler/index.html,v $</li>
</ul>
<h1>Scope</h1>
This document contains the specification of the LiveSupport Scheduler
@ -42,7 +43,7 @@ playlists on a local audio interface. Specific goals include:<br>
<h2>System functions</h2>
The main system functions are described below. There are three
categories for these functions:<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">function category<br>
@ -73,7 +74,7 @@ that it is performed<br>
</table>
<br>
<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">ref#<br>
@ -218,7 +219,7 @@ reasons<br>
<h2>System attributes</h2>
Generic attributes<br>
<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">ref#<br>
@ -286,7 +287,7 @@ which focuses only on audio aspects of SMIL.<br>
<br>
Attributes related to system functions<br>
<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">ref#<br>
@ -385,9 +386,9 @@ This section lists generic (essential) uses cases, that do not contain
architecture-specific considerations.<br>
<br>
<object type="image/svg+xml" name="essential use cases"
data="EssentialUseCases.svg" width="700" height="800"></object>
data="EssentialUseCases.svg" height="800" width="700"></object>
<h3>UC-1 Upload playlist</h3>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
@ -420,7 +421,7 @@ architecture-specific considerations.<br>
</tbody>
</table>
<h4>Typical course of events</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
@ -499,7 +500,7 @@ notified and the use case ends.<br>
</ul>
<h3>UC-2 Manage schedule<br>
</h3>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b><br>
@ -544,7 +545,7 @@ decides to, he might remove or re-schedule some of these playlists. </td>
<br>
<h4>Typical course of events<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
@ -655,7 +656,7 @@ again<br>
</ul>
<h3>UC-3 Manage playlists<br>
</h3>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b><br>
@ -698,7 +699,7 @@ playlists. If he decides so, he might delete some of these playlists. </td>
<br>
<h4>Typical course of events<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
@ -781,7 +782,7 @@ user is notified, and the list of playlists is displayed to the user.<br>
</ul>
<h3>UC-4 Retrieve remote files<br>
</h3>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
@ -830,7 +831,7 @@ Note that this use case is somewhat reversed, as it is initiated by the
system (not an actor), and the main tasks are done by an external actor
(the Media archive).<br>
<h4>Typical course of events</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
@ -958,7 +959,7 @@ audio clip. the system is notified and the use case ends.<br>
</ul>
<h3>UC-5 Review play log<br>
</h3>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
@ -995,7 +996,7 @@ reasons. </td>
</table>
<h4>Typical course of events<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
@ -1074,7 +1075,7 @@ authenticated. the user is notified and the use case ends.</li>
<br>
<h3>UC-6 Create playlist<br>
</h3>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
@ -1116,7 +1117,7 @@ on the system.<br>
</table>
<h4>Typical course of events<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
@ -1196,7 +1197,7 @@ authenticated. the user is notified and the use case ends.</li>
<br>
<h3>UC-7 Edit playlist<br>
</h3>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
@ -1237,7 +1238,7 @@ professionals to edit the playlsits on the system.<br>
</table>
<h4>Typical course of events<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
@ -1391,7 +1392,7 @@ shown.</li>
<br>
<h3>UC-8 Start/stop scheduler<br>
</h3>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>ref#</b> </td>
@ -1432,7 +1433,7 @@ deamon with the same script.<br>
</table>
<h4>Typical course of events<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th colspan="2" valign="top">actor action <br>
@ -1500,11 +1501,11 @@ The following figure displays the semantic concepts identified for the
Scheduler daemon, and the main associations between the concepts.<br>
<br>
<object type="image/svg+xml" name="essential use cases"
data="Concepts.svg" width="950" height="1000"></object>
data="Concepts.svg" height="1000" width="950"></object>
<br>
<h3>Concepts</h3>
<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">concept<br>
@ -1643,7 +1644,7 @@ stopping the scheduler daemon.<br>
<br>
<h3>Associations</h3>
<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<th valign="top">source<br>
@ -1898,43 +1899,43 @@ is discussed in this section.<br>
System diagrams are presented for each use case below.<br>
<h4>UC-1 Upload playlists</h4>
<object type="image/svg+xml" name="upload playlists sequence diagram"
data="Uploadplaylists_SequenceDiagram.svg" width="550" height="200"></object>
data="Uploadplaylists_SequenceDiagram.svg" height="200" width="550"></object>
<br>
<h4>UC-2 Manage schedule</h4>
<object type="image/svg+xml" name="manage playlists sequence diagram"
data="Manageschedule_SequenceDiagram.svg" width="650" height="350"></object>
data="Manageschedule_SequenceDiagram.svg" height="350" width="650"></object>
<br>
<h4>UC-3 Manage playlists</h4>
<object type="image/svg+xml" name="manage playlists sequence diagram"
data="Manageplaylists_SequenceDiagram.svg" width="650" height="300"></object>
data="Manageplaylists_SequenceDiagram.svg" height="300" width="650"></object>
<br>
<h4>UC-4 Retrieve remote files<br>
</h4>
<object type="image/svg+xml"
name="retrieve remote files sequence diagram"
data="Retrieveremotefiles_SequenceDiagram.svg" width="750" height="300"></object>
data="Retrieveremotefiles_SequenceDiagram.svg" height="300" width="750"></object>
<br>
<h4>UC-5 Review play log</h4>
<object type="image/svg+xml" name="review play log sequence diagram"
data="Reviewplaylog_SequenceDiagram.svg" width="650" height="250"></object>
data="Reviewplaylog_SequenceDiagram.svg" height="250" width="650"></object>
<h4>UC-6 Create playlist</h4>
<object type="image/svg+xml" name="create playlist sequence diagram"
data="Createplaylist_SequenceDiagram.svg" width="650" height="250"></object>
data="Createplaylist_SequenceDiagram.svg" height="250" width="650"></object>
<h4>UC-7 Edit playlist<br>
<object type="image/svg+xml" name="edit playlist sequence diagram"
data="Editplaylist_SequenceDiagram.svg" width="800" height="500"></object>
data="Editplaylist_SequenceDiagram.svg" height="500" width="800"></object>
</h4>
<h4>UC-8 Start/stop scheduler</h4>
<object type="image/svg+xml"
name="start/stop scheduler sequence diagram"
data="Startstopscheduler_SequenceDiagram.svg" width="600" height="200"></object>
data="Startstopscheduler_SequenceDiagram.svg" height="200" width="600"></object>
<br>
<br>
<h3>System objects</h3>
The following figures shows the system objects and their functions, as
derived from the system sequence diagrams.<br>
<object type="image/svg+xml" name="system behaviour"
data="Systembehaviour.svg" width="550" height="450"></object>
data="Systembehaviour.svg" height="450" width="550"></object>
<h3>Contracts</h3>
For all operations exposed in the system sequence diagrams, the
following contracts are defined.<br>
@ -1942,7 +1943,7 @@ following contracts are defined.<br>
See Authentication : authenticate<br>
<br>
<h4>Contract for Scheduler : uploadPlaylist</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -1950,7 +1951,7 @@ See Authentication : authenticate<br>
<td colspan="2" rowspan="1" valign="top">uploadPlaylist<br>
(playlist : Playlist,<br>
playtime: Schedule)<br>
: void<br>
: UniqueId<br>
</td>
</tr>
<tr>
@ -1990,7 +1991,8 @@ an error<br>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
<td colspan="2" rowspan="1" valign="top">the unique id of the
ScheduleEntry created with this upload<br>
</td>
</tr>
<tr>
@ -2051,7 +2053,7 @@ supplied schedule<br>
</table>
<br>
<h4>Contract for Scheduler : displaySchedule</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -2125,7 +2127,7 @@ the specified time period.<br>
</table>
<br>
<h4>Contract for Scheduler : displayPlaylist</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -2198,7 +2200,7 @@ for the specified playlistId, indicate as an error.<br>
</table>
<br>
<h4>Contract for Scheduler : deletePlaylist</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -2298,15 +2300,14 @@ error.<br>
<br>
<h4>Contract for Scheduler : removeFromSchedule<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">removeFromSchedule<br>
(scheduleEntry : Schedule entry,<br>
playlist : Playlist)<br>
: void<br>
(scheduleEntryId : UniqueId)<br>
: bool<br>
</td>
</tr>
<tr>
@ -2337,15 +2338,16 @@ playlist from a schedule entry<br>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If the specified
scheduleEntry does not exist, indicate as an error.<br>
If the specified playlist does not exist, indicate as an error.<br>
<td colspan="2" rowspan="1" valign="top">If no ScheduleEntry by
the specified
scheduleEntryId exist, indicate as an error.<br>
</td>
</tr>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
<td colspan="2" rowspan="1" valign="top">true if the specified
entry was removed, false if it did not exist.<br>
</td>
</tr>
<tr>
@ -2370,6 +2372,15 @@ is removed.<br>
<td valign="top">association broken<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
<td valign="top">The ScheduleEntry specified by the
scheduleEntryId is deleted<br>
</td>
<td valign="top">instance deletion<br>
</td>
</tr>
<tr>
<td valign="top"><br>
</td>
@ -2383,16 +2394,15 @@ is removed.<br>
<br>
<h4>Contract for Scheduler : reschedule<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">reschedule<br>
(scheduleEntry : Schedule entry,<br>
playlist : Playlist,<br>
(scheduleEntryId : UniqueId,<br>
playtime : TimeStamp)<br>
: void<br>
: bool<br>
</td>
</tr>
<tr>
@ -2423,9 +2433,9 @@ playlist is scheduled to play.<br>
<tr>
<td valign="top"><b>Exceptions</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">If the specified
scheduleEntry does not exist, indicate as an error.<br>
If the specified playlist does not exist, indicate as an error.<br>
<td colspan="2" rowspan="1" valign="top">If no ScheduleEntry by
the specified
scheduleEntryId exist, indicate as an error.<br>
If the new playtime conflicts with other schedule entries, indicate as
an error.<br>
</td>
@ -2433,7 +2443,7 @@ an error.<br>
<tr>
<td valign="top"><b>Output</b><br>
</td>
<td colspan="2" rowspan="1" valign="top">none<br>
<td colspan="2" rowspan="1" valign="top">false on errors<br>
</td>
</tr>
<tr>
@ -2470,7 +2480,7 @@ to the supplied playtime.<br>
</table>
<br>
<h4>Contract for Scheduler : displayPlaylists</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -2543,7 +2553,7 @@ in the Playlist store.<br>
</table>
<br>
<h4>Contract for Scheduler : displayPlayLog</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -2617,7 +2627,7 @@ contained in the Play log.<br>
<br>
<h4>Contract for Scheduler : generatePlayReport<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -2692,7 +2702,7 @@ Audio clips played in the specified time period.<br>
<br>
<h4>Contract for Scheduler : createPlaylist<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -2790,7 +2800,7 @@ for the playlist<br>
<br>
<h4>Contract for Scheduler : openPlaylistForEditing<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -2886,7 +2896,7 @@ for the playlist<br>
<br>
<h4>Contract for Scheduler : addAudioClipToPlaylist<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -2974,7 +2984,7 @@ the playlist with the audio clip, with the specified relativeOffset<br>
<br>
<h4>Contract for Scheduler : displayAudioClips<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3049,7 +3059,7 @@ the Scheduler<br>
<br>
<h4>Contract for Scheduler : displayAudioClip<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3125,7 +3135,7 @@ by the audioClipId<br>
<br>
<h4>Contract for Scheduler : removeAudioClipFromPlaylist<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3212,7 +3222,7 @@ with the Playlist is removed, with the related FadeInfo instances<br>
<br>
<h4>Contract for Scheduler : updateFadeInFadeOut<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3298,7 +3308,7 @@ audio clip in the playlist are updated<br>
<br>
<h4>Contract for Scheduler : validatePlaylist<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3373,7 +3383,7 @@ for being complete (not containing silence) and other sanity criteria.<br>
<br>
<h4>Contract for Scheduler : savePlaylist<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3466,7 +3476,7 @@ been used for reverting is deleted (see revertEditedPlaylist)<br>
<br>
<h4>Contract for Scheduler : revertEditedPlaylist<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3561,7 +3571,7 @@ for the playlist<br>
<br>
<h4>Contract for Scheduler : start<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3654,7 +3664,7 @@ deamon to run<br>
<br>
<h4>Contract for Scheduler : isRunning<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3730,7 +3740,7 @@ running, false otherwise<br>
<br>
<h4>Contract for Scheduler : stop<br>
</h4>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3814,7 +3824,7 @@ currently running<br>
<br>
<h4>Contract for Media archive : authenticate</h4>
TODO: move to Media archive spec<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3887,7 +3897,7 @@ authentication is recognized, false otherwise<br>
<br>
<h4>Contract for Media archive : retrieveAudioClip</h4>
TODO: move to Media archive spec<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -3977,7 +3987,7 @@ contents of the retrieved audio clip<br>
<br>
<h4>Contract for Local storage : authenticate</h4>
TODO: move to Local storage spec<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -4050,7 +4060,7 @@ authentication is recognized, false otherwise<br>
<br>
<h4>Contract for Local storage : existsAudioClip</h4>
TODO: move to Local storage spec<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>
@ -4123,7 +4133,7 @@ with the provided id exists, false otherwise<br>
<br>
<h4>Contract for Local storage : storeAudioClip</h4>
TODO: move to Local storage spec<br>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<table border="0" cellpadding="2" cellspacing="2" width="100%">
<tbody>
<tr>
<td valign="top"><b>Name</b><br>

View File

@ -21,7 +21,7 @@
#
#
# Author : $Author: maroy $
# Version : $Revision: 1.4 $
# Version : $Revision: 1.5 $
# Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/etc/Makefile.in,v $
#
# @configure_input@
@ -112,6 +112,7 @@ SCHEDULER_OBJS = ${TMP_DIR}/SignalDispatcher.o \
${TMP_DIR}/UploadPlaylistMethod.o \
${TMP_DIR}/DisplayScheduleMethod.o \
${TMP_DIR}/DisplayPlaylistMethod.o \
${TMP_DIR}/RemoveFromScheduleMethod.o \
${TMP_DIR}/ScheduleFactory.o \
${TMP_DIR}/PostgresqlSchedule.o
@ -126,9 +127,11 @@ TEST_RUNNER_OBJS = ${SCHEDULER_OBJS} \
${TMP_DIR}/SchedulerDaemonUploadTest.o \
${TMP_DIR}/SchedulerDaemonDisplayScheduleTest.o \
${TMP_DIR}/SchedulerDaemonDisplayPlaylistTest.o \
${TMP_DIR}/SchedulerDaemonRemoveFromScheduleTest.o \
${TMP_DIR}/UploadPlaylistMethodTest.o \
${TMP_DIR}/DisplayScheduleMethodTest.o \
${TMP_DIR}/DisplayPlaylistMethodTest.o \
${TMP_DIR}/RemoveFromScheduleMethodTest.o \
${TMP_DIR}/PostgresqlScheduleTest.o \
${TMP_DIR}/TestRunner.o
TEST_RUNNER_LIBS = ${SCHEDULER_EXE_LIBS} -lcppunit -ldl

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.2 $
Version : $Revision: 1.3 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/PostgresqlSchedule.cxx,v $
------------------------------------------------------------------------------*/
@ -109,6 +109,21 @@ const std::string PostgresqlSchedule::getScheduleEntriesStmt =
"(? <= starts) AND (starts < ?) "
"ORDER BY starts";
/*------------------------------------------------------------------------------
* The SQL statement for querying if a schedule entry exists.
* Expects a single argument, the id of the schedule to check.
* Returns 1 if the entry exists, 0 otherwise.
*----------------------------------------------------------------------------*/
const std::string PostgresqlSchedule::scheduleEntryExistsStmt =
"SELECT COUNT(*) FROM schedule WHERE id = ?";
/*------------------------------------------------------------------------------
* The SQL statement for removing a schedule.
* Expects a single argument, the id of the schedule to remove.
*----------------------------------------------------------------------------*/
const std::string PostgresqlSchedule::removeFromScheduleStmt =
"DELETE FROM schedule WHERE id = ?";
/* =============================================== local function prototypes */
@ -219,7 +234,7 @@ PostgresqlSchedule :: isTimeframeAvailable(
/*------------------------------------------------------------------------------
* Schedule a playlist
*----------------------------------------------------------------------------*/
void
Ptr<UniqueId>::Ref
PostgresqlSchedule :: schedulePlaylist(
Ptr<Playlist>::Ref playlist,
Ptr<ptime>::Ref playtime)
@ -227,11 +242,11 @@ PostgresqlSchedule :: schedulePlaylist(
{
Ptr<Connection>::Ref conn;
bool result = false;
Ptr<UniqueId>::Ref id;
try {
conn = cm->getConnection();
Ptr<Timestamp>::Ref timestamp;
Ptr<UniqueId>::Ref id;
Ptr<ptime>::Ref ends;
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
schedulePlaylistStmt));
@ -260,6 +275,8 @@ PostgresqlSchedule :: schedulePlaylist(
if (!result) {
throw std::invalid_argument("couldn't insert into database");
}
return id;
}
@ -316,3 +333,68 @@ PostgresqlSchedule :: getScheduleEntries(
return result;
}
/*------------------------------------------------------------------------------
* Tell if a schedule entry exists.
*----------------------------------------------------------------------------*/
bool
PostgresqlSchedule :: scheduleEntryExists(
Ptr<const UniqueId>::Ref entryId)
throw ()
{
Ptr<Connection>::Ref conn;
bool result = false;
try {
conn = cm->getConnection();
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
scheduleEntryExistsStmt));
pstmt->setInt(1, entryId->getId());
Ptr<ResultSet>::Ref rs(pstmt->executeQuery());
result = (rs->next()) ? (rs->getInt(1) == 1) : false;
cm->returnConnection(conn);
} catch (std::exception &e) {
if (conn) {
cm->returnConnection(conn);
}
throw std::invalid_argument(e.what());
}
return result;
}
/*------------------------------------------------------------------------------
* Remove a schedule entry from a schedule
*----------------------------------------------------------------------------*/
void
PostgresqlSchedule :: removeFromSchedule(
Ptr<const UniqueId>::Ref entryId)
throw (std::invalid_argument)
{
Ptr<Connection>::Ref conn;
bool result = false;
try {
conn = cm->getConnection();
Ptr<PreparedStatement>::Ref pstmt(conn->prepareStatement(
removeFromScheduleStmt));
pstmt->setInt(1, entryId->getId());
result = pstmt->executeUpdate() == 1;
cm->returnConnection(conn);
} catch (std::exception &e) {
if (conn) {
cm->returnConnection(conn);
}
throw std::invalid_argument(e.what());
}
if (!result) {
throw std::invalid_argument("specified schedule entry does not exist");
}
}

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.3 $
Version : $Revision: 1.4 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/PostgresqlSchedule.h,v $
------------------------------------------------------------------------------*/
@ -81,7 +81,7 @@ using namespace LiveSupport::Core;
* </code></pre>
*
* @author $Author: maroy $
* @version $Revision: 1.3 $
* @version $Revision: 1.4 $
*/
class PostgresqlSchedule : public Configurable,
public ScheduleInterface
@ -117,6 +117,16 @@ class PostgresqlSchedule : public Configurable,
*/
static const std::string getScheduleEntriesStmt;
/**
* The SQL statement for telling if a schedule entry exists.
*/
static const std::string scheduleEntryExistsStmt;
/**
* The SQL statement for removing a schedule entry.
*/
static const std::string removeFromScheduleStmt;
/**
* The database connection manager to use for connecting the
* database.
@ -216,10 +226,11 @@ class PostgresqlSchedule : public Configurable,
*
* @param playlist the playlist to schedule.
* @param playtime the time to schedule the playlist for.
* @return the id of the newly created playlist.
* @exception std::invalid_argument if the there is something
* already scheduled for the duration of the playlist.
*/
virtual void
virtual Ptr<UniqueId>::Ref
schedulePlaylist(Ptr<Playlist>::Ref playlist,
Ptr<ptime>::Ref playtime)
throw (std::invalid_argument);
@ -237,6 +248,28 @@ class PostgresqlSchedule : public Configurable,
getScheduleEntries(Ptr<ptime>::Ref fromTime,
Ptr<ptime>::Ref toTime)
throw ();
/**
* Tell if a schedule entry exists by the give name.
*
* @param entryId the id of the schedule entry to check for.
* @return true if the schedule entry exists in the Schedule,
* false otherwise.
*/
virtual bool
scheduleEntryExists(Ptr<const UniqueId>::Ref entryId)
throw ();
/**
* Remove a schedule entry from the schedule.
*
* @param entryId the id of the schedule to remove.
* @exception std::invalid_argument if no schedule with the specified
* id exists.
*/
virtual void
removeFromSchedule(Ptr<const UniqueId>::Ref entryId)
throw (std::invalid_argument);
};

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.3 $
Version : $Revision: 1.4 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/PostgresqlScheduleTest.cxx,v $
------------------------------------------------------------------------------*/
@ -299,3 +299,97 @@ PostgresqlScheduleTest :: getScheduleEntriesTest(void)
}
/*------------------------------------------------------------------------------
* See if scheduleEntryExists() returns correct results
*----------------------------------------------------------------------------*/
void
PostgresqlScheduleTest :: scheduleEntryExistsTest(void)
throw (CPPUNIT_NS::Exception)
{
// create a 1 hour long playlist
Ptr<UniqueId>::Ref playlistId = UniqueId::generateId();
Ptr<time_duration>::Ref playlength(new time_duration(1, 0, 0));
Ptr<Playlist>::Ref playlist(new Playlist(playlistId, playlength));
Ptr<ptime>::Ref from;
Ptr<ptime>::Ref to;
Ptr<UniqueId>::Ref entryId1;
Ptr<UniqueId>::Ref entryId2;
// at the very first, check for a nonexistent entry
entryId1.reset(new UniqueId(9999));
CPPUNIT_ASSERT(!schedule->scheduleEntryExists(entryId1));
try {
// schedule our playlist for 2004-07-23, 10 o'clock
from.reset(new ptime(time_from_string("2004-07-23 10:00:00")));
entryId1 = schedule->schedulePlaylist(playlist, from);
// schedule our playlist for 2004-07-23, 12 o'clock
from.reset(new ptime(time_from_string("2004-07-23 12:00:00")));
entryId2 = schedule->schedulePlaylist(playlist, from);
// now let's check if our entries exist
CPPUNIT_ASSERT(schedule->scheduleEntryExists(entryId1));
CPPUNIT_ASSERT(schedule->scheduleEntryExists(entryId2));
} catch (std::invalid_argument &e) {
CPPUNIT_FAIL(e.what());
}
}
/*------------------------------------------------------------------------------
* See if removeFromSchedule() really removes
*----------------------------------------------------------------------------*/
void
PostgresqlScheduleTest :: removeFromScheduleTest(void)
throw (CPPUNIT_NS::Exception)
{
// create a 1 hour long playlist
Ptr<UniqueId>::Ref playlistId = UniqueId::generateId();
Ptr<time_duration>::Ref playlength(new time_duration(1, 0, 0));
Ptr<Playlist>::Ref playlist(new Playlist(playlistId, playlength));
Ptr<ptime>::Ref from;
Ptr<ptime>::Ref to;
Ptr<UniqueId>::Ref entryId1;
Ptr<UniqueId>::Ref entryId2;
// at the very first, try to remove something not scheduled
bool gotException = false;
try {
entryId1.reset(new UniqueId(9999));
schedule->removeFromSchedule(entryId1);
} catch (std::invalid_argument &e) {
gotException = true;
}
CPPUNIT_ASSERT(gotException);
try {
// schedule our playlist for 2004-07-23, 10 o'clock
from.reset(new ptime(time_from_string("2004-07-23 10:00:00")));
entryId1 = schedule->schedulePlaylist(playlist, from);
// schedule our playlist for 2004-07-23, 12 o'clock
from.reset(new ptime(time_from_string("2004-07-23 12:00:00")));
entryId2 = schedule->schedulePlaylist(playlist, from);
// now let's remove one of them, and see that it's not there anymore
CPPUNIT_ASSERT(schedule->scheduleEntryExists(entryId1));
schedule->removeFromSchedule(entryId1);
CPPUNIT_ASSERT(!schedule->scheduleEntryExists(entryId1));
// now let's remove the other, and see that it's not there anymore
CPPUNIT_ASSERT(schedule->scheduleEntryExists(entryId2));
schedule->removeFromSchedule(entryId2);
CPPUNIT_ASSERT(!schedule->scheduleEntryExists(entryId2));
} catch (std::invalid_argument &e) {
CPPUNIT_FAIL(e.what());
}
}

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.2 $
Version : $Revision: 1.3 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/PostgresqlScheduleTest.h,v $
------------------------------------------------------------------------------*/
@ -64,7 +64,7 @@ using namespace LiveSupport::Core;
* Unit test for the PostgresqlSchedule class.
*
* @author $Author: maroy $
* @version $Revision: 1.2 $
* @version $Revision: 1.3 $
* @see PostgresqlSchedule
*/
class PostgresqlScheduleTest : public CPPUNIT_NS::TestFixture
@ -74,6 +74,8 @@ class PostgresqlScheduleTest : public CPPUNIT_NS::TestFixture
CPPUNIT_TEST(simpleScheduleTest);
CPPUNIT_TEST(scheduleAndQueryTest);
CPPUNIT_TEST(getScheduleEntriesTest);
CPPUNIT_TEST(scheduleEntryExistsTest);
CPPUNIT_TEST(removeFromScheduleTest);
CPPUNIT_TEST_SUITE_END();
private:
@ -123,6 +125,22 @@ class PostgresqlScheduleTest : public CPPUNIT_NS::TestFixture
void
getScheduleEntriesTest(void) throw (CPPUNIT_NS::Exception);
/**
* Schedule some playlists, then check if they exist.
*
* @exception CPPUNIT_NS::Exception on test failures.
*/
void
scheduleEntryExistsTest(void) throw (CPPUNIT_NS::Exception);
/**
* Schedule some playlists, then remove them.
*
* @exception CPPUNIT_NS::Exception on test failures.
*/
void
removeFromScheduleTest(void) throw (CPPUNIT_NS::Exception);
public:
/**

View File

@ -0,0 +1,141 @@
/*------------------------------------------------------------------------------
Copyright (c) 2004 Media Development Loan Fund
This file is part of the LiveSupport project.
http://livesupport.campware.org/
To report bugs, send an e-mail to bugs@campware.org
LiveSupport is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
LiveSupport is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LiveSupport; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Author : $Author: maroy $
Version : $Revision: 1.1 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/RemoveFromScheduleMethod.cxx,v $
------------------------------------------------------------------------------*/
/* ============================================================ include files */
#ifdef HAVE_CONFIG_H
#include "configure.h"
#endif
#ifdef HAVE_TIME_H
#include <time.h>
#else
#error need time.h
#endif
#include <string>
#include "ScheduleInterface.h"
#include "ScheduleFactory.h"
#include "RemoveFromScheduleMethod.h"
using namespace LiveSupport;
using namespace LiveSupport::Core;
using namespace LiveSupport::Scheduler;
/* =================================================== local data structures */
/* ================================================ local constants & macros */
/*------------------------------------------------------------------------------
* The name of this XML-RPC method.
*----------------------------------------------------------------------------*/
const std::string RemoveFromScheduleMethod::methodName = "removeFromSchedule";
/*------------------------------------------------------------------------------
* The name of the playlist id member in the XML-RPC parameter
* structure.
*----------------------------------------------------------------------------*/
const std::string RemoveFromScheduleMethod::scheduleEntryIdName =
"scheduleEntryId";
/* =============================================== local function prototypes */
/* ============================================================= module code */
/*------------------------------------------------------------------------------
* Construct the method and register it right away.
*----------------------------------------------------------------------------*/
RemoveFromScheduleMethod :: RemoveFromScheduleMethod (
Ptr<XmlRpc::XmlRpcServer>::Ref xmlRpcServer) throw()
: XmlRpc::XmlRpcServerMethod(methodName, xmlRpcServer.get())
{
}
/*------------------------------------------------------------------------------
* Extract the UniqueId from an XML-RPC function call parameter
*----------------------------------------------------------------------------*/
Ptr<UniqueId>::Ref
RemoveFromScheduleMethod :: extractScheduleEntryId(
XmlRpc::XmlRpcValue & xmlRpcValue)
throw (std::invalid_argument)
{
if (!xmlRpcValue.hasMember(scheduleEntryIdName)) {
throw std::invalid_argument("no playlist id in parameter structure");
}
Ptr<UniqueId>::Ref id(new UniqueId((int) xmlRpcValue[scheduleEntryIdName]));
return id;
}
/*------------------------------------------------------------------------------
* Execute the remove from schedule XML-RPC function call.
*----------------------------------------------------------------------------*/
void
RemoveFromScheduleMethod :: execute(XmlRpc::XmlRpcValue & parameters,
XmlRpc::XmlRpcValue & returnValue)
throw ()
{
try {
if (!parameters.valid()) {
// TODO: mark error
returnValue = XmlRpc::XmlRpcValue(false);
return;
}
Ptr<UniqueId>::Ref entryId = extractScheduleEntryId(parameters[0]);
Ptr<ScheduleFactory>::Ref sf = ScheduleFactory::getInstance();
Ptr<ScheduleInterface>::Ref schedule = sf->getSchedule();
if (!schedule->scheduleEntryExists(entryId)) {
// TODO: mark error;
returnValue = XmlRpc::XmlRpcValue(false);
return;
}
schedule->removeFromSchedule(entryId);
} catch (std::invalid_argument &e) {
// TODO: mark error
returnValue = XmlRpc::XmlRpcValue(false);
return;
}
returnValue = XmlRpc::XmlRpcValue(true);
}

View File

@ -0,0 +1,148 @@
/*------------------------------------------------------------------------------
Copyright (c) 2004 Media Development Loan Fund
This file is part of the LiveSupport project.
http://livesupport.campware.org/
To report bugs, send an e-mail to bugs@campware.org
LiveSupport is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
LiveSupport is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LiveSupport; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Author : $Author: maroy $
Version : $Revision: 1.1 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/RemoveFromScheduleMethod.h,v $
------------------------------------------------------------------------------*/
#ifndef RemoveFromScheduleMethod_h
#define RemoveFromScheduleMethod_h
#ifndef __cplusplus
#error This is a C++ include file
#endif
/* ============================================================ include files */
#ifdef HAVE_CONFIG_H
#include "configure.h"
#endif
#include <stdexcept>
#include <string>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <XmlRpcServerMethod.h>
#include <XmlRpcValue.h>
#include "LiveSupport/Core/Ptr.h"
#include "LiveSupport/Core/UniqueId.h"
namespace LiveSupport {
namespace Scheduler {
using namespace LiveSupport;
using namespace LiveSupport::Core;
/* ================================================================ constants */
/* =================================================================== macros */
/* =============================================================== data types */
/**
* An XML-RPC method object to remove a scheduled entry.
*
* The name of the method when called through XML-RPC is "removeFromSchedule".
* The expected parameter is an XML-RPC structure, with the following
* members:
* <ul>
* <li>scheduleEntryId - int - the id of the scheduled entry to remove</li>
* </ul>
*
* @author $Author: maroy $
* @version $Revision: 1.1 $
*/
class RemoveFromScheduleMethod : public XmlRpc::XmlRpcServerMethod
{
private:
/**
* The name of this method, as it will be registered into the
* XML-RPC server.
*/
static const std::string methodName;
/**
* The name of the entry id member in the XML-RPC parameter
* structure.
*/
static const std::string scheduleEntryIdName;
/**
* Extract the schedule entry id from the XML-RPC parameters.
*
* @param xmlRpcValue the XML-RPC parameter to extract from.
* @return a UniqueId that was found in the XML-RPC parameter.
* @exception std::invalid_argument if there was no UniqueId
* in xmlRpcValue
*/
Ptr<UniqueId>::Ref
extractScheduleEntryId(XmlRpc::XmlRpcValue & xmlRpcValue)
throw (std::invalid_argument);
public:
/**
* A default constructor, for testing purposes.
*/
RemoveFromScheduleMethod(void) throw ()
: XmlRpc::XmlRpcServerMethod(methodName)
{
}
/**
* Constuctor that registers the method with the server right away.
*
* @param xmlRpcServer the XML-RPC server to register with.
*/
RemoveFromScheduleMethod(
Ptr<XmlRpc::XmlRpcServer>::Ref xmlRpcServer)
throw ();
/**
* Execute the remove from schedule command on the Scheduler daemon.
*
* @param parameters XML-RPC function call parameters
* @param returnValue the return value of the call (out parameter)
*/
void
execute( XmlRpc::XmlRpcValue & parameters,
XmlRpc::XmlRpcValue & returnValue) throw ();
};
/* ================================================= external data structures */
/* ====================================================== function prototypes */
} // namespace Scheduler
} // namespace LiveSupport
#endif // RemoveFromScheduleMethod_h

View File

@ -0,0 +1,185 @@
/*------------------------------------------------------------------------------
Copyright (c) 2004 Media Development Loan Fund
This file is part of the LiveSupport project.
http://livesupport.campware.org/
To report bugs, send an e-mail to bugs@campware.org
LiveSupport is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
LiveSupport is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LiveSupport; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Author : $Author: maroy $
Version : $Revision: 1.1 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/RemoveFromScheduleMethodTest.cxx,v $
------------------------------------------------------------------------------*/
/* ============================================================ include files */
#ifdef HAVE_CONFIG_H
#include "configure.h"
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#else
#error "Need unistd.h"
#endif
#include <string>
#include <iostream>
#include <XmlRpcValue.h>
#include "ScheduleFactory.h"
#include "UploadPlaylistMethod.h"
#include "RemoveFromScheduleMethod.h"
#include "RemoveFromScheduleMethodTest.h"
using namespace LiveSupport::Scheduler;
/* =================================================== local data structures */
/* ================================================ local constants & macros */
CPPUNIT_TEST_SUITE_REGISTRATION(RemoveFromScheduleMethodTest);
/**
* The name of the configuration file for the schedule factory.
*/
const std::string RemoveFromScheduleMethodTest::scheduleConfig =
"etc/scheduleFactory.xml";
/* =============================================== local function prototypes */
/* ============================================================= module code */
/*------------------------------------------------------------------------------
* Configure a Configurable with an XML file.
*----------------------------------------------------------------------------*/
void
RemoveFromScheduleMethodTest :: configure(
Ptr<Configurable>::Ref configurable,
const std::string fileName)
throw (std::invalid_argument,
xmlpp::exception)
{
Ptr<xmlpp::DomParser>::Ref parser(new xmlpp::DomParser(fileName, true));
const xmlpp::Document * document = parser->get_document();
const xmlpp::Element * root = document->get_root_node();
configurable->configure(*root);
}
/*------------------------------------------------------------------------------
* Set up the test environment
*----------------------------------------------------------------------------*/
void
RemoveFromScheduleMethodTest :: setUp(void) throw ()
{
try {
Ptr<ScheduleFactory>::Ref sf = ScheduleFactory::getInstance();
configure(sf, scheduleConfig);
schedule = sf->getSchedule();
schedule->install();
} catch (std::invalid_argument &e) {
CPPUNIT_FAIL("semantic error in configuration file");
} catch (xmlpp::exception &e) {
CPPUNIT_FAIL("error parsing configuration file");
} catch (std::exception &e) {
CPPUNIT_FAIL(e.what());
}
}
/*------------------------------------------------------------------------------
* Clean up the test environment
*----------------------------------------------------------------------------*/
void
RemoveFromScheduleMethodTest :: tearDown(void) throw ()
{
schedule->uninstall();
}
/*------------------------------------------------------------------------------
* Just a very simple smoke test
*----------------------------------------------------------------------------*/
void
RemoveFromScheduleMethodTest :: firstTest(void)
throw (CPPUNIT_NS::Exception)
{
Ptr<UploadPlaylistMethod>::Ref uploadMethod(
new UploadPlaylistMethod());
Ptr<RemoveFromScheduleMethod>::Ref removeMethod(
new RemoveFromScheduleMethod());
XmlRpc::XmlRpcValue rootParameter;
XmlRpc::XmlRpcValue parameters;
XmlRpc::XmlRpcValue result;
struct tm time;
Ptr<UniqueId>::Ref entryId;
// first schedule (upload) a playlist)
parameters["playlistId"] = 1;
time.tm_year = 2001;
time.tm_mon = 11;
time.tm_mday = 12;
time.tm_hour = 10;
time.tm_min = 0;
time.tm_sec = 0;
parameters["playtime"] = &time;
rootParameter[0] = parameters;
uploadMethod->execute(rootParameter, result);
entryId.reset(new UniqueId((int) result));
parameters.clear();
result.clear();
parameters["scheduleEntryId"] = (int) entryId->getId();
rootParameter[0] = parameters;
removeMethod->execute(rootParameter, result);
CPPUNIT_ASSERT(result);
}
/*------------------------------------------------------------------------------
* A test to try to remove a not-scheduled entry
*----------------------------------------------------------------------------*/
void
RemoveFromScheduleMethodTest :: negativeTest(void)
throw (CPPUNIT_NS::Exception)
{
Ptr<RemoveFromScheduleMethod>::Ref removeMethod(
new RemoveFromScheduleMethod());
XmlRpc::XmlRpcValue rootParameter;
XmlRpc::XmlRpcValue parameters;
XmlRpc::XmlRpcValue result;
Ptr<UniqueId>::Ref entryId(new UniqueId(9999));
parameters["scheduleEntryId"] = (int) entryId->getId();
rootParameter[0] = parameters;
removeMethod->execute(rootParameter, result);
CPPUNIT_ASSERT(!result);
}

View File

@ -0,0 +1,143 @@
/*------------------------------------------------------------------------------
Copyright (c) 2004 Media Development Loan Fund
This file is part of the LiveSupport project.
http://livesupport.campware.org/
To report bugs, send an e-mail to bugs@campware.org
LiveSupport is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
LiveSupport is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LiveSupport; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Author : $Author: maroy $
Version : $Revision: 1.1 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/RemoveFromScheduleMethodTest.h,v $
------------------------------------------------------------------------------*/
#ifndef RemoveFromScheduleMethodTest_h
#define RemoveFromScheduleMethodTest_h
#ifndef __cplusplus
#error This is a C++ include file
#endif
/* ============================================================ include files */
#ifdef HAVE_CONFIG_H
#include "configure.h"
#endif
#include <cppunit/extensions/HelperMacros.h>
namespace LiveSupport {
namespace Scheduler {
using namespace LiveSupport;
using namespace LiveSupport::Core;
/* ================================================================ constants */
/* =================================================================== macros */
/* =============================================================== data types */
/**
* Unit test for the RemoveFromScheduleMethod class.
*
* @author $Author: maroy $
* @version $Revision: 1.1 $
* @see RemoveFromScheduleMethod
*/
class RemoveFromScheduleMethodTest : public CPPUNIT_NS::TestFixture
{
CPPUNIT_TEST_SUITE(RemoveFromScheduleMethodTest);
CPPUNIT_TEST(firstTest);
CPPUNIT_TEST(negativeTest);
CPPUNIT_TEST_SUITE_END();
/**
* The name of the configuration file for the schedule factory.
*/
static const std::string scheduleConfig;
/**
* The schedule used during the test.
*/
Ptr<ScheduleInterface>::Ref schedule;
/**
* Configure a configurable with an XML file.
*
* @param configurable configure this
* @param fileName the name of the XML file to configure with.
* @exception std::invalid_argument on configuration errors.
* @exception xmlpp::exception on XML parsing errors.
*/
void
configure(Ptr<Configurable>::Ref configurable,
std::string fileName)
throw (std::invalid_argument,
xmlpp::exception);
protected:
/**
* A simple test.
*
* @exception CPPUNIT_NS::Exception on test failures.
*/
void
firstTest(void) throw (CPPUNIT_NS::Exception);
/**
* A simple test for trying to remove a non-existent entry.
*
* @exception CPPUNIT_NS::Exception on test failures.
*/
void
negativeTest(void) throw (CPPUNIT_NS::Exception);
public:
/**
* Set up the environment for the test case.
*/
void
setUp(void) throw ();
/**
* Clean up the environment after the test case.
*/
void
tearDown(void) throw ();
};
/* ================================================= external data structures */
/* ====================================================== function prototypes */
} // namespace Scheduler
} // namespace LiveSupport
#endif // RemoveFromScheduleMethodTest_h

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.2 $
Version : $Revision: 1.3 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/ScheduleInterface.h,v $
------------------------------------------------------------------------------*/
@ -70,7 +70,7 @@ using namespace LiveSupport::Core;
* The generic interface for the component scheduling events.
*
* @author $Author: maroy $
* @version $Revision: 1.2 $
* @version $Revision: 1.3 $
*/
class ScheduleInterface : virtual public Installable
{
@ -92,10 +92,11 @@ class ScheduleInterface : virtual public Installable
*
* @param playlist the playlist to schedule.
* @param playtime the time to schedule the playlist for.
* @return the id of the newly created playlist.
* @exception std::invalid_argument if the there is something
* already scheduled for the duration of the playlist.
*/
virtual void
virtual Ptr<UniqueId>::Ref
schedulePlaylist(Ptr<Playlist>::Ref playlist,
Ptr<ptime>::Ref playtime)
throw (std::invalid_argument)
@ -115,6 +116,30 @@ class ScheduleInterface : virtual public Installable
Ptr<ptime>::Ref toTime)
throw ()
= 0;
/**
* Tell if a schedule entry exists by the give name.
*
* @param entryId the id of the schedule entry to check for.
* @return true if the schedule entry exists in the Schedule,
* false otherwise.
*/
virtual bool
scheduleEntryExists(Ptr<const UniqueId>::Ref entryId)
throw ()
= 0;
/**
* Remove a schedule entry from the schedule.
*
* @param entryId the id of the schedule to remove.
* @exception std::invalid_argument if no schedule with the specified
* id exists.
*/
virtual void
removeFromSchedule(Ptr<const UniqueId>::Ref entryId)
throw (std::invalid_argument)
= 0;
};

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.3 $
Version : $Revision: 1.4 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/SchedulerDaemon.cxx,v $
------------------------------------------------------------------------------*/
@ -165,6 +165,7 @@ SchedulerDaemon :: registerXmlRpcFunctions(
xmlRpcServer->addMethod(uploadPlaylistMethod.get());
xmlRpcServer->addMethod(displayScheduleMethod.get());
xmlRpcServer->addMethod(displayPlaylistMethod.get());
xmlRpcServer->addMethod(removeFromScheduleMethod.get());
}

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.4 $
Version : $Revision: 1.5 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/SchedulerDaemon.h,v $
------------------------------------------------------------------------------*/
@ -63,6 +63,7 @@
#include "UploadPlaylistMethod.h"
#include "DisplayScheduleMethod.h"
#include "DisplayPlaylistMethod.h"
#include "RemoveFromScheduleMethod.h"
#include "XmlRpcDaemon.h"
@ -118,7 +119,7 @@ using namespace LiveSupport::Core;
* </code></pre>
*
* @author $Author: maroy $
* @version $Revision: 1.4 $
* @version $Revision: 1.5 $
* @see ConnectionManagerFactory
* @see StorageClientFactory
* @see ScheduleFactory
@ -150,6 +151,11 @@ class SchedulerDaemon : public Installable,
*/
Ptr<DisplayPlaylistMethod>::Ref displayPlaylistMethod;
/**
* The RemoveFromScheduleMethod the daemon is providing.
*/
Ptr<RemoveFromScheduleMethod>::Ref removeFromScheduleMethod;
/**
* Default constructor.
*/
@ -159,6 +165,7 @@ class SchedulerDaemon : public Installable,
uploadPlaylistMethod.reset(new UploadPlaylistMethod());
displayScheduleMethod.reset(new DisplayScheduleMethod());
displayPlaylistMethod.reset(new DisplayPlaylistMethod());
removeFromScheduleMethod.reset(new RemoveFromScheduleMethod());
}
protected:

View File

@ -0,0 +1,168 @@
/*------------------------------------------------------------------------------
Copyright (c) 2004 Media Development Loan Fund
This file is part of the LiveSupport project.
http://livesupport.campware.org/
To report bugs, send an e-mail to bugs@campware.org
LiveSupport is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
LiveSupport is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LiveSupport; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Author : $Author: maroy $
Version : $Revision: 1.1 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/Attic/SchedulerDaemonRemoveFromScheduleTest.cxx,v $
------------------------------------------------------------------------------*/
/* ============================================================ include files */
#ifdef HAVE_CONFIG_H
#include "configure.h"
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#else
#error "Need unistd.h"
#endif
#include <string>
#include <XmlRpcClient.h>
#include <XmlRpcValue.h>
#include "SchedulerDaemon.h"
#include "SchedulerDaemonRemoveFromScheduleTest.h"
using namespace XmlRpc;
using namespace LiveSupport::Scheduler;
/* =================================================== local data structures */
/* ================================================ local constants & macros */
CPPUNIT_TEST_SUITE_REGISTRATION(SchedulerDaemonRemoveFromScheduleTest);
/**
* The name of the configuration file for the scheduler daemon.
*/
static const std::string configFileName = "etc/scheduler.xml";
/* =============================================== local function prototypes */
/* ============================================================= module code */
/*------------------------------------------------------------------------------
* Set up the test environment
*----------------------------------------------------------------------------*/
void
SchedulerDaemonRemoveFromScheduleTest :: setUp(void) throw ()
{
Ptr<SchedulerDaemon>::Ref daemon = SchedulerDaemon::getInstance();
if (!daemon->isConfigured()) {
try {
std::auto_ptr<xmlpp::DomParser>
parser(new xmlpp::DomParser(configFileName, true));
const xmlpp::Document * document = parser->get_document();
daemon->configure(*(document->get_root_node()));
} catch (std::invalid_argument &e) {
std::cerr << e.what() << std::endl;
CPPUNIT_FAIL("semantic error in configuration file");
} catch (xmlpp::exception &e) {
std::cerr << e.what() << std::endl;
CPPUNIT_FAIL("error parsing configuration file");
}
}
daemon->install();
// daemon->start();
// sleep(5);
}
/*------------------------------------------------------------------------------
* Clean up the test environment
*----------------------------------------------------------------------------*/
void
SchedulerDaemonRemoveFromScheduleTest :: tearDown(void) throw ()
{
Ptr<SchedulerDaemon>::Ref daemon = SchedulerDaemon::getInstance();
// daemon->stop();
daemon->uninstall();
}
/*------------------------------------------------------------------------------
* A simple smoke test.
*----------------------------------------------------------------------------*/
void
SchedulerDaemonRemoveFromScheduleTest :: simpleTest(void)
throw (CPPUNIT_NS::Exception)
{
XmlRpcValue parameters;
XmlRpcValue result;
struct tm time;
XmlRpcClient xmlRpcClient("localhost", 3344, "/RPC2", false);
// first schedule a playlist, so that there is something to remove
parameters["playlistId"] = 1;
time.tm_year = 2001;
time.tm_mon = 11;
time.tm_mday = 12;
time.tm_hour = 10;
time.tm_min = 0;
time.tm_sec = 0;
parameters["playtime"] = &time;
xmlRpcClient.execute("uploadPlaylist", parameters, result);
CPPUNIT_ASSERT(result.valid());
Ptr<UniqueId>::Ref entryId(new UniqueId((int) result));
parameters["scheduleEntryId"] = (int) entryId->getId();
xmlRpcClient.execute("removeFromSchedule", parameters, result);
CPPUNIT_ASSERT(result.valid());
CPPUNIT_ASSERT(((bool)result) == true);
}
/*------------------------------------------------------------------------------
* A simple negative test.
*----------------------------------------------------------------------------*/
void
SchedulerDaemonRemoveFromScheduleTest :: negativeTest(void)
throw (CPPUNIT_NS::Exception)
{
XmlRpcValue parameters;
XmlRpcValue result;
XmlRpcClient xmlRpcClient("localhost", 3344, "/RPC2", false);
parameters["scheduleEntryId"] = 9999;
xmlRpcClient.execute("removeFromSchedule", parameters, result);
CPPUNIT_ASSERT(result.valid());
CPPUNIT_ASSERT(((bool)result) == false);
}

View File

@ -0,0 +1,117 @@
/*------------------------------------------------------------------------------
Copyright (c) 2004 Media Development Loan Fund
This file is part of the LiveSupport project.
http://livesupport.campware.org/
To report bugs, send an e-mail to bugs@campware.org
LiveSupport is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
LiveSupport is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LiveSupport; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Author : $Author: maroy $
Version : $Revision: 1.1 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/Attic/SchedulerDaemonRemoveFromScheduleTest.h,v $
------------------------------------------------------------------------------*/
#ifndef SchedulerDaemonRemoveFromScheduleTest_h
#define SchedulerDaemonRemoveFromScheduleTest_h
#ifndef __cplusplus
#error This is a C++ include file
#endif
/* ============================================================ include files */
#ifdef HAVE_CONFIG_H
#include "configure.h"
#endif
#include <cppunit/extensions/HelperMacros.h>
namespace LiveSupport {
namespace Scheduler {
using namespace LiveSupport;
/* ================================================================ constants */
/* =================================================================== macros */
/* =============================================================== data types */
/**
* Unit test to test the removeFromSchedule XML-RPC call.
*
* @author $Author: maroy $
* @version $Revision: 1.1 $
* @see SchedulerDaemon
*/
class SchedulerDaemonRemoveFromScheduleTest : public CPPUNIT_NS::TestFixture
{
CPPUNIT_TEST_SUITE(SchedulerDaemonRemoveFromScheduleTest);
CPPUNIT_TEST(simpleTest);
CPPUNIT_TEST(negativeTest);
CPPUNIT_TEST_SUITE_END();
protected:
/**
* Simple smoke test.
*
* @exception CPPUNIT_NS::Exception on test failures.
*/
void
simpleTest(void) throw (CPPUNIT_NS::Exception);
/**
* Simple negative test.
*
* @exception CPPUNIT_NS::Exception on test failures.
*/
void
negativeTest(void) throw (CPPUNIT_NS::Exception);
public:
/**
* Set up the environment for the test case.
*/
void
setUp(void) throw ();
/**
* Clean up the environment after the test case.
*/
void
tearDown(void) throw ();
};
/* ================================================= external data structures */
/* ====================================================== function prototypes */
} // namespace Scheduler
} // namespace LiveSupport
#endif // SchedulerDaemonRemoveFromScheduleTest_h

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.2 $
Version : $Revision: 1.3 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/Attic/SchedulerDaemonUploadTest.cxx,v $
------------------------------------------------------------------------------*/
@ -135,6 +135,6 @@ SchedulerDaemonUploadTest :: simpleTest(void)
parameters["playtime"] = &time;
xmlRpcClient.execute("uploadPlaylist", parameters, result);
CPPUNIT_ASSERT(result);
CPPUNIT_ASSERT(result.valid());
}

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.3 $
Version : $Revision: 1.4 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/UploadPlaylistMethod.cxx,v $
------------------------------------------------------------------------------*/
@ -135,11 +135,11 @@ UploadPlaylistMethod :: extractPlayschedule(
/*------------------------------------------------------------------------------
* Execute the stop XML-RPC function call.
* Execute the upload playlist method XML-RPC function call.
*----------------------------------------------------------------------------*/
void
UploadPlaylistMethod :: execute( XmlRpc::XmlRpcValue & parameters,
XmlRpc::XmlRpcValue & returnValue)
UploadPlaylistMethod :: execute(XmlRpc::XmlRpcValue & parameters,
XmlRpc::XmlRpcValue & returnValue)
throw ()
{
try {
@ -151,6 +151,7 @@ UploadPlaylistMethod :: execute( XmlRpc::XmlRpcValue & parameters,
Ptr<UniqueId>::Ref id = extractPlaylistId(parameters[0]);
Ptr<ptime>::Ref playschedule = extractPlayschedule(parameters[0]);
Ptr<UniqueId>::Ref scheduleEntryId;
Ptr<StorageClientFactory>::Ref scf;
Ptr<StorageClientInterface>::Ref storage;
@ -177,15 +178,14 @@ UploadPlaylistMethod :: execute( XmlRpc::XmlRpcValue & parameters,
return;
}
schedule->schedulePlaylist(playlist, playschedule);
scheduleEntryId = schedule->schedulePlaylist(playlist, playschedule);
returnValue = XmlRpc::XmlRpcValue((int) scheduleEntryId->getId());
} catch (std::invalid_argument &e) {
// TODO: mark error
returnValue = XmlRpc::XmlRpcValue(false);
return;
}
// TODO
returnValue = XmlRpc::XmlRpcValue(true);
}

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.3 $
Version : $Revision: 1.4 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/UploadPlaylistMethod.h,v $
------------------------------------------------------------------------------*/
@ -76,9 +76,11 @@ using namespace LiveSupport::Core;
* <li>playtime - the time when the playlist should be scheduled,
* an ISO 8601 DateTime field</li>
* </ul>
* The return value is an int, the id of the schedule entry created
* by uploading, or a boolean false, if there were errors.
*
* @author $Author: maroy $
* @version $Revision: 1.3 $
* @version $Revision: 1.4 $
*/
class UploadPlaylistMethod : public XmlRpc::XmlRpcServerMethod
{

View File

@ -22,7 +22,7 @@
Author : $Author: maroy $
Version : $Revision: 1.3 $
Version : $Revision: 1.4 $
Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/scheduler/src/UploadPlaylistMethodTest.cxx,v $
------------------------------------------------------------------------------*/
@ -169,7 +169,7 @@ UploadPlaylistMethodTest :: firstTest(void)
rootParameter[0] = parameters;
method->execute(rootParameter, result);
CPPUNIT_ASSERT(result);
CPPUNIT_ASSERT(result.valid());
}
@ -198,7 +198,7 @@ UploadPlaylistMethodTest :: overlappingPlaylists(void)
rootParameter[0] = parameters;
method->execute(rootParameter, result);
CPPUNIT_ASSERT(result);
CPPUNIT_ASSERT(result.valid());
// try to load the same one, but in an overlapping time region
// (we know that playlist with id 1 in 1 hour long)
@ -227,7 +227,7 @@ UploadPlaylistMethodTest :: overlappingPlaylists(void)
rootParameter[0] = parameters;
method->execute(rootParameter, result);
CPPUNIT_ASSERT(result);
CPPUNIT_ASSERT(result.valid());
// try to load the same one, this time overlapping both previos instnaces
parameters["playlistId"] = 1;