1%%	options
2
3copyright owner	=	Dirk Krause
4copyright year	=	2012-xxxx
5SPDX-License-Identifier:	BSD-3-Clause
6
7
8%%	module
9
10#include <libdk3c/dk3all.h>
11#include <itadmin/itadmin.h>
12
13
14
15$!trace-include
16
17
18
19/**	Keywords used by the module.
20*/
21static char const * const itadmin_license_c8_kw[] = {
22$!string-table
23#
24#  0:	Newline
25#
26\n
27#
28#  1:	Space
29#
30
31#
32#  2:	File name for license report
33#
34licenses.tex
35#
36#  3:	File open mode: write
37#
38w
39#
40#  4:	Opening a chapter
41#
42\\chapter{
43#
44#  5:	Ending a LaTeX command
45#
46}
47#
48#  6:	Clearpage command
49#
50\\clearpage
51#
52#  7:	End long table
53#
54\\\\\n\\end{longtable}
55#
56#  8:	Section
57#
58\\section{
59#
60#  9:	Subsection
61#
62\\subsection{
63#
64# 10:	Subsubsection
65#
66\\subsubsection{
67#
68# 11:
69#
70pdftitle={
71#
72# 12:
73#
74pdfsubject={
75#
76# 13:
77#
78pdfauthor={
79#
80# 14:
81#
82pdfcreator={itadmin - http://sourceforge.net/p/dktools/wiki/itadmin/}
83#
84# 15:
85#
86\\author{
87#
88# 16:
89#
90\\title{
91#
92# 17: Comma
93#
94,
95#
96# 18: Begin long table
97#
98\\begin{longtable}{lll}
99#
100# 19
101#
102\\endfirsthead
103#
104# 20
105#
106\\endhead
107#
108# 21
109#
110\\endfoot
111#
112# 22
113#
114\\endlastfoot
115#
116# 23
117#
118\\\\[0.5em]
119#
120# 24
121#
122&
123#
124# 25
125#
126\\multicolumn{2}{l}{
127#
128# 26
129#
130\\\\*
131#
132# 27
133#
134\\textit{
135#
136# 28
137#
138\\chapter[
139#
140# 29
141#
142]{
143#
144# 30
145#
146\\section[
147#
148# 31
149#
150\\emph{
151#
152# 32
153#
154\\/}
155$!end
156};
157
158
159
160/**	Start of LaTeX source.
161*/
162static char const * const	itadmin_license_file_start1a[] = {
163$!text
164\documentclass[titlepage,origlongtable]{scrbook}
165\KOMAoptions{paper=a4}
166\KOMAoptions{fontsize=12pt}
167$!end
168};
169
170
171
172/**	Start of LaTeX source.
173*/
174static char const * const	itadmin_license_file_start1b[] = {
175$!text
176\documentclass[12pt]{book}
177$!end
178};
179
180
181/**	LaTeX packages after ngerman.
182*/
183static char const * const       itadmin_license_file_start4[] = {
184$!text
185\usepackage{ifpdf}
186\usepackage[utf8]{inputenc}
187\usepackage{mathptmx}
188\usepackage[scaled=.92]{helvet}
189\usepackage{courier}
190\usepackage[T1]{fontenc}
191\usepackage{textcomp}
192\usepackage{latexsym}
193\usepackage{varioref}
194\usepackage{color}
195\usepackage{makeidx}
196\usepackage{longtable}
197\makeindex
198\ifpdf
199\usepackage{microtype}
200\pdfcompresslevel=9
201\usepackage[
202pdftex,
203colorlinks=true,
204pdfpagemode=UseNone,
205pdfstartview={XYZ 0 835 1.25},
206bookmarksnumbered,
207$!end
208};
209
210
211
212/**	LaTeX package after hyperref options for title, subject, author.
213*/
214static char const * const	itadmin_license_file_start2[] = {
215$!text
216]{hyperref}
217\else
218\usepackage[dvips,colorlinks=true,linkcolor=black]{hyperref}
219\fi
220\parindent0cm
221$!end
222};
223
224
225
226/**	Renewcommand used only for koma-script.
227*/
228static char const * const	itadmin_license_file_start3a[] = {
229$!text
230\renewcommand*{\sectfont}{\bfseries}
231$!end
232};
233
234
235
236/**	Final commands after title and author.
237*/
238static char const * const	itadmin_license_file_start3[] = {
239$!text
240\setcounter{secnumdepth}{1}
241\begin{document}
242$!end
243};
244
245
246
247/**	LaTeX file end.
248*/
249static char const * const	itadmin_license_file_end[] = {
250$!text
251\end{document}
252$!end
253};
254
255
256
257/**	Write data for one license.
258	@param	job	Job structure.
259	@param	os	Output stream.
260	@param	lic	License to write.
261*/
262static
263void
264itadmin_license_write_license_type(
265  itadmin_job		*job,
266  dk3_stream_t		*os,
267  itadmin_license	*lic
268)
269{
270  char const		*ltn;
271  int			 ie;
272  ltn = NULL;
273  if(lic->ltype) {
274    ltn = (lic->ltype)->sn;
275    if((lic->ltype)->ln) {
276      ltn = (lic->ltype)->ln;
277    }
278  }
279  dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
280  if(ltn) {
281    dk3uc2lat_c8_utf8_stputs(job->uc2l, os, ltn);
282  } else {
283    ie = dk3app_get_encoding(job->app);
284    dk3uc2lat_stputs(job->uc2l, os, (job->msg)[53], ie);
285  }
286  dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
287}
288
289
290
291/**	Check whether we must write the license owner because the host owner
292	differs from the license owner.
293	@param	user	License owner.
294	@param	host	Host on which the license is used.
295	@return	1 if host and license owner differ, 0 if they match.
296*/
297static
298int
299itadmin_license_must_write_license_owner(itadmin_user *user, itadmin_host *host)
300{
301  int		back	= 0;
302  if(user) {
303    if(user->us) {
304      if(host) {
305        if(host->un) {
306	  if((host->un)->us) {
307	    if(dk3str_c8_cmp(user->us, (host->un)->us)) {
308	      back = 1;
309	    }
310	  }
311	} else {
312	}
313      } else {
314      }
315    }
316  }
317  return back;
318}
319
320
321
322/**	Check whether we must write the host owner because the host owner
323	differs from the license owner.
324	@param	user	License owner.
325	@param	host	Host on which the license is used.
326	@return	1 if host and license owner differ, 0 if they match.
327*/
328static
329int
330itadmin_license_must_write_host_owner(itadmin_user *user, itadmin_host *host)
331{
332  int		 back = 0;
333  if(host) {
334    if(host->un) {
335      if(user) {
336        if((host->un)->us) {
337	  if(user->us) {
338	    if(dk3str_c8_cmp((host->un)->us, user->us)) {
339	      back = 1;
340	    }
341	  } else {
342	    back = 1;
343	  }
344	}
345      } else {
346        back = 1;
347      }
348    }
349  }
350  return back;
351}
352
353
354
355/**	Write data for one license.
356	@param	job	Job structure.
357	@param	os	Output stream.
358	@param	lic	License to write.
359	@param	pman	Software manufacturuer name.
360	@param	pprod	Software product name.
361	@param	mn	Flag: Write software manufacturer name.
362	@param	pn	Flag: Write software product name.
363	@param	un	Flag: Write user name who owns the license.
364	@param	hn	Flag: Write host name where license is used.
365	@param	ond	On difference between license owner and host owner:
366	0=do nothing, 1=write host owner, 2=write license owner
367*/
368static
369void
370itadmin_license_write_license(
371  itadmin_job		*job,
372  dk3_stream_t		*os,
373  itadmin_license	*lic,
374  char const		*pman,
375  char const		*pprod,
376  int			 mn,
377  int			 pn,
378  int			 un,
379  int			 hn,
380  int			 ond
381)
382{
383  char		bu[128];
384  int		ie;
385  ie = dk3app_get_encoding(job->app);
386  sprintf(bu, "%lu", lic->pk);
387  dk3stream_c8_fputs(os, bu);
388  dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
389  if((mn) && (pman)) {
390    dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
391    dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pman);
392    dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
393    if((pn) && (pprod)) {
394      dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
395      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
396      dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
397      dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
398      dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pprod);
399      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
400    }
401    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
402    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
403    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
404    itadmin_license_write_license_type(job, os, lic);
405  } else {
406    if((pn) && (pprod)) {
407      dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
408      dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pprod);
409      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
410      dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
411      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
412      dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
413      itadmin_license_write_license_type(job, os, lic);
414    } else {
415      itadmin_license_write_license_type(job, os, lic);
416    }
417  }
418  if(lic->notes) {
419    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
420    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
421    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
422    dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
423    dk3uc2lat_c8_utf8_stputs(job->uc2l, os, lic->notes);
424    dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
425  }
426  if(un) {
427    if(lic->owner) {
428      dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
429      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
430      dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
431      dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
432      itadmin_tool_write_user_latex_long(job, os, lic->owner);
433      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
434    }
435  }
436  if(hn) {
437    if(lic->host) {
438      dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
439      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
440      dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
441      if((lic->host)->sn) {
442        dk3uc2lat_c8_utf8_stputs(job->uc2l, os, (lic->host)->sn);
443      }
444      dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
445      if((lic->host)->co) {
446        dk3uc2lat_c8_utf8_stputs(job->uc2l, os, (lic->host)->co);
447      }
448      switch(ond) {
449        case 1: {	/* On difference write host owner. */
450	  if(itadmin_license_must_write_host_owner(lic->owner, lic->host)) {
451	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
452	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
453	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
454            dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
455	    if(mn) { dk3stream_c8_fputs(os, itadmin_license_c8_kw[27]); }
456            itadmin_tool_write_user_latex_long(job, os, (lic->host)->un);
457	    if(mn) { dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]); }
458            dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
459	  }
460	} break;
461	case 2: {	/* On difference write license owner. */
462	  if(itadmin_license_must_write_license_owner(lic->owner, lic->host)) {
463	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
464	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
465	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
466            dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
467	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[27]);
468            itadmin_tool_write_user_latex_long(job, os, lic->owner);
469	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
470            dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
471	  }
472	} break;
473      }
474    }
475  } else {
476    if((lic->host) && (lic->owner)) {
477      switch(ond) {
478        case 1: {
479	  if(itadmin_license_must_write_host_owner(lic->owner, lic->host)) {
480	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
481	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
482	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
483            dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
484	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[27]);
485            itadmin_tool_write_user_latex_long(job, os, (lic->host)->un);
486	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
487            dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
488	  }
489        } break;
490        case 2: {
491	  if(itadmin_license_must_write_license_owner(lic->owner, lic->host)) {
492	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
493	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
494	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
495            dk3stream_c8_fputs(os, itadmin_license_c8_kw[25]);
496	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[27]);
497            itadmin_tool_write_user_latex_long(job, os, lic->owner);
498	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
499            dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
500	  }
501        } break;
502      }
503    }
504  }
505  if(lic->order) {
506    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
507    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
508    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
509    dk3uc2lat_stputs(job->uc2l, os, (job->msg)[54], ie);
510    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
511    dk3uc2lat_c8_utf8_stputs(job->uc2l, os, lic->order);
512  }
513  if(((lic->d_del).d) && ((lic->d_del).m) && ((lic->d_del).y)) {
514    if(job->gdate) {
515      sprintf(
516        bu, "%02d.%02d.%04d", (lic->d_del).d, (lic->d_del).m, (lic->d_del).y
517      );
518    } else {
519      sprintf(
520        bu, "%04d-%02d-%02d", (lic->d_del).y, (lic->d_del).m, (lic->d_del).d
521      );
522    }
523    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
524    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
525    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
526    dk3uc2lat_stputs(job->uc2l, os, (job->msg)[55], ie);
527    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
528    dk3stream_c8_fputs(os, bu);
529  }
530  if(lic->i_del) {
531    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
532    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
533    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
534    dk3uc2lat_stputs(job->uc2l, os, (job->msg)[56], ie);
535    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
536    dk3uc2lat_c8_utf8_stputs(job->uc2l, os, lic->i_del);
537  }
538  if(((lic->d_inv).d) && ((lic->d_inv).m) && ((lic->d_inv).y)) {
539    if(job->gdate) {
540      sprintf(
541        bu, "%02d.%02d.%04d", (lic->d_inv).d, (lic->d_inv).m, (lic->d_inv).y
542      );
543    } else {
544      sprintf(
545        bu, "%04d-%02d-%02d", (lic->d_inv).y, (lic->d_inv).m, (lic->d_inv).d
546      );
547    }
548    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
549    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
550    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
551    dk3uc2lat_stputs(job->uc2l, os, (job->msg)[57], ie);
552    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
553    dk3stream_c8_fputs(os, bu);
554  }
555  if(lic->i_inv) {
556    dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
557    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
558    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
559    dk3uc2lat_stputs(job->uc2l, os, (job->msg)[58], ie);
560    dk3stream_c8_fputs(os, itadmin_license_c8_kw[24]);
561    dk3uc2lat_c8_utf8_stputs(job->uc2l, os, lic->i_inv);
562  }
563}
564
565
566
567/**	Get software manufacturer name.
568	@param	li	License
569	@return	Software manufacturer name on success, NULL on error.
570*/
571static
572char const *
573itadmin_license_get_manufacturer(itadmin_license *li)
574{
575  char const		*back = NULL;
576  if(li->prod) {
577    if((li->prod)->mn) {
578      back = ((li->prod)->mn)->sn;
579      if(((li->prod)->mn)->ln) {
580        back = ((li->prod)->mn)->ln;
581      }
582    }
583  }
584  return back;
585}
586
587
588
589/**	Get software product name.
590	@param	li	License.
591	@return	Product name on success, NULL on error.
592*/
593static
594char const *
595itadmin_license_get_product(itadmin_license *li)
596{
597  char const		*back = NULL;
598  if(li->prod) {
599    back = (li->prod)->sn;
600    if((li->prod)->ln) {
601      back = (li->prod)->ln;
602    }
603  }
604  return back;
605}
606
607
608
609/**	Check whether manufacturer and/or product have changed.
610	@param	pman
611	@param	prev_man
612	@param	pprod
613	@param	prev_prod
614	@return	0=no change, 1=product change, 2=manufacturer change.
615*/
616static
617int
618itadmin_license_change_level(
619  char const	*pman,
620  char const	*prev_man,
621  char const	*pprod,
622  char const	*prev_prod
623)
624{
625  int		 back = 0;
626  $? "+ itadmin_license_change_level \"%!8s\"=\"%!8s\" \"%!8s\"=\"%!8s\"", TR_8STR(pman), TR_8STR(prev_man), TR_8STR(pprod), TR_8STR(prev_prod)
627  if(pprod) {
628    if(prev_prod) {
629      if(dk3str_c8_cmp(pprod, prev_prod)) {
630        back = 1;
631      }
632    } else { back = 1; }
633  } else {
634    if(prev_prod) { back = 1; }
635  }
636  if(pman) {
637    if(prev_man) {
638      if(dk3str_c8_cmp(pman, prev_man)) {
639        back = 2;
640      }
641    } else { back = 2; }
642  } else {
643    if(prev_man) { back = 2; }
644  } $? "- itadmin_license_change_level %d", back
645  return back;
646}
647
648
649
650/**	Start a longtable for the licenses.
651	@param	os	Output stream.
652*/
653static
654void
655itadmin_license_start_longtable_for_licenses(
656  dk3_stream_t	*os
657)
658{
659  dk3stream_c8_fputs(os, itadmin_license_c8_kw[18]);
660  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
661  dk3stream_c8_fputs(os, itadmin_license_c8_kw[19]);
662  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
663  dk3stream_c8_fputs(os, itadmin_license_c8_kw[20]);
664  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
665  dk3stream_c8_fputs(os, itadmin_license_c8_kw[21]);
666  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
667  dk3stream_c8_fputs(os, itadmin_license_c8_kw[22]);
668  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
669}
670
671
672
673/**	End a longtable for the licenses.
674	@param	os	Output stream.
675*/
676static
677void
678itadmin_license_end_longtable_for_licenses(
679  dk3_stream_t	*os
680)
681{
682  dk3stream_c8_fputs(os, itadmin_license_c8_kw[7]);
683  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
684}
685
686
687
688/**	Write available licenses.
689	@param	job	Job structure.
690	@param	os	Output stream.
691*/
692static
693void
694itadmin_license_write_available(itadmin_job *job, dk3_stream_t *os)
695{
696  itadmin_license	*li;		/* Current license to print. */
697  char const		*prev_man;	/* Previous software manufacturer. */
698  char const		*prev_prod;	/* Previous software product. */
699  char const		*pman;		/* Current software manufacturer. */
700  char const		*pprod;		/* Current software product. */
701  int			 have_chap;	/* Flag: Chapter was started. */
702  int			 have_tab;	/* Flag: Table was started. */
703  int			 ie;		/* Input encoding. */
704  $? "+ itadmin_license_write_available"
705  ie = dk3app_get_encoding(job->app);
706  have_chap = have_tab = 0;
707  prev_man = NULL; prev_prod = NULL;
708  dk3sto_it_reset(job->i_lf);
709  while(NULL != (li = (itadmin_license *)dk3sto_it_next(job->i_lf))) {
710    if(!(have_chap)) {
711      dk3stream_c8_fputs(os, itadmin_license_c8_kw[4]);
712      dk3uc2lat_stputs(job->uc2l, os, (job->msg)[48], ie);
713      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
714      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
715      dk3uc2lat_stputs(job->uc2l, os, (job->msg)[49], ie);
716      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
717      dk3uc2lat_stputs(job->uc2l, os, (job->msg)[50], ie);
718      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
719    } have_chap = 1;
720    pman = itadmin_license_get_manufacturer(li);	$? ". pman  = \"%!8s\"", TR_8STR(pman)
721    pprod = itadmin_license_get_product(li);		$? ". pprod = \"%!8s\"", TR_8STR(pprod)
722    switch(itadmin_license_change_level(pman, prev_man, pprod, prev_prod)) {
723      case 2: {		/* Manufacturer changed. */
724        if(have_tab) {
725	  itadmin_license_end_longtable_for_licenses(os);
726          dk3stream_c8_fputs(os, itadmin_license_c8_kw[6]);
727          dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
728        }
729	dk3stream_c8_fputs(os, itadmin_license_c8_kw[8]);
730	dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pman);
731	dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
732	dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
733	dk3stream_c8_fputs(os, itadmin_license_c8_kw[9]);
734	dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pprod);
735	dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
736	dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
737	have_tab = 0;
738      } break;
739      case 1: {		/* Product changed. */
740        if(have_tab) {
741	  itadmin_license_end_longtable_for_licenses(os);
742          dk3stream_c8_fputs(os, itadmin_license_c8_kw[6]);
743          dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
744	}
745	dk3stream_c8_fputs(os, itadmin_license_c8_kw[9]);
746	dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pprod);
747	dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
748	dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
749	have_tab = 0;
750      } break;
751      default: {	/* No change. */
752        if(have_tab) {
753	  dk3stream_c8_fputs(os, itadmin_license_c8_kw[23]);
754	  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
755	}
756      } break;
757    }
758    if(!(have_tab)) {
759      itadmin_license_start_longtable_for_licenses(os);
760      have_tab = 1;
761    }
762    itadmin_license_write_license(job, os, li, pman, pprod, 0, 0, 0, 0, 0);
763    prev_man = pman; prev_prod = pprod;
764  }
765  if(have_chap) {
766    if(have_tab) {
767      /* end{longtable} */
768      itadmin_license_end_longtable_for_licenses(os);
769    }
770    /* clearpage */
771    dk3stream_c8_fputs(os, itadmin_license_c8_kw[6]);
772    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
773  } $? "- itadmin_license_write_available"
774}
775
776
777
778/**	Write license report per user/host.
779	@param	job	Job structure.
780	@param	os	Output stream.
781*/
782static
783void
784itadmin_license_write_user(itadmin_job *job, dk3_stream_t *os)
785{
786  itadmin_user		*us;
787  itadmin_host		*ho;
788  itadmin_license	*li;
789  char const		*pman;
790  char const		*pprod;
791  char const		*prev_man;
792  char const		*prev_prod;
793  int			 have_chap;
794  int			 have_sec;
795#if VERSION_BEFORE_20150821
796  int			 have_subsec;
797#endif
798  int			 have_tab;
799  int			 ie;
800  $? "+ itadmin_license_write_user"
801  ie = dk3app_get_encoding(job->app);
802  dk3sto_it_reset(job->i_us);
803  while(NULL != (us = (itadmin_user *)dk3sto_it_next(job->i_us))) {
804    have_chap = 0;
805#if VERSION_BEFORE_20150821
806    have_sec = 0;
807#endif
808#if VERSION_BEFORE_20150821
809    have_subsec = 0;
810#endif
811#if VERSION_BEFORE_20150821
812    have_tab = 0;
813#endif
814    /*
815    	Licenses on hosts
816    */
817    if(us->i_ho) {
818      dk3sto_it_reset(us->i_ho);
819      while(NULL != (ho = (itadmin_host *)dk3sto_it_next(us->i_ho))) {
820        have_sec = 0;
821#if VERSION_BEFORE_20150821
822	have_subsec = 0;
823#endif
824        if(ho->i_li) {
825	  prev_man = NULL;
826	  prev_prod = NULL;
827	  have_tab = 0;
828	  dk3sto_it_reset(ho->i_li);
829	  while(NULL != (li = (itadmin_license *)dk3sto_it_next(ho->i_li))) {
830	    pman = itadmin_license_get_manufacturer(li);
831	    pprod = itadmin_license_get_product(li);
832	    switch(itadmin_license_change_level(pman,prev_man,pprod,prev_prod))
833	    {
834	      case 2: {		/* Manufacturer changed. */
835	        if(have_tab) {
836		  itadmin_license_end_longtable_for_licenses(os);
837		} have_tab = 0;
838		if(!(have_chap)) {
839		  dk3stream_c8_fputs(os, itadmin_license_c8_kw[28]);
840		  itadmin_tool_write_user_latex_short(job, os, us);
841		  dk3stream_c8_fputs(os, itadmin_license_c8_kw[29]);
842		  itadmin_tool_write_user_latex_long(job, os, us);
843		  dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
844		  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
845		} have_chap = 1;
846		if(!(have_sec)) {
847		  dk3stream_c8_fputs(os, itadmin_license_c8_kw[8]);
848		  dk3uc2lat_c8_utf8_stputs(job->uc2l, os, ho->sn);
849		  dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
850		  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
851		} have_sec = 1;
852		dk3stream_c8_fputs(os, itadmin_license_c8_kw[9]);
853		dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pman);
854		dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
855		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
856	      } break;
857	      default: {	/* Manufacturer unchanged. */
858	        if(have_tab) {
859		  dk3stream_c8_fputs(os, itadmin_license_c8_kw[23]);
860                  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
861		}
862	      } break;
863	    }
864	    if(!(have_tab)) {
865	      itadmin_license_start_longtable_for_licenses(os);
866	      have_tab = 1;
867	    }
868	    itadmin_license_write_license(job, os, li, pman, pprod, 0, 1, 0, 0, 2);
869	    prev_man = pman; prev_prod = pprod;
870	  }
871	  if(have_tab) {
872	    itadmin_license_end_longtable_for_licenses(os);
873	  }
874	  if(have_sec) {
875	    /* clearpage */
876	    dk3stream_c8_fputs(os, itadmin_license_c8_kw[6]);
877            dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
878	  }
879	}
880      }
881    }
882    if(us->i_li) {
883      /*
884    	  Licenses not assigned to hosts
885      */
886      have_sec = 0; have_tab = 0;
887      dk3sto_it_reset(us->i_li);
888      prev_man = NULL; prev_prod = NULL;
889      while(NULL != (li = (itadmin_license *)dk3sto_it_next(us->i_li))) {
890        if(!(li->host)) {
891	  pman = itadmin_license_get_manufacturer(li);
892	  pprod = itadmin_license_get_product(li);
893	  switch(itadmin_license_change_level(pman,prev_man,pprod,prev_prod))
894	  {
895	    case 2: {	/* Manufacturer changed */
896	      if(have_tab) {
897	        itadmin_license_end_longtable_for_licenses(os);
898	      } have_tab = 0;
899	      if(!(have_chap)) {
900		dk3stream_c8_fputs(os, itadmin_license_c8_kw[28]);
901		itadmin_tool_write_user_latex_short(job, os, us);
902		dk3stream_c8_fputs(os, itadmin_license_c8_kw[29]);
903		itadmin_tool_write_user_latex_long(job, os, us);
904		dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
905		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
906	      } have_chap = 1;
907	      if(!(have_sec)) {
908		dk3stream_c8_fputs(os, itadmin_license_c8_kw[30]);
909      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[60], ie);
910		dk3stream_c8_fputs(os, itadmin_license_c8_kw[29]);
911      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[61], ie);
912		dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
913		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
914      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[64], ie);
915		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
916      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[65], ie);
917		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
918      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[66], ie);
919		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
920	      } have_sec = 1;
921	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[9]);
922	      dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pman);
923	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
924	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
925	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[10]);
926	      dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pprod);
927	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
928	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
929	    } break;
930	    case 1: {	/* Product changed */
931	      if(have_tab) {
932	        itadmin_license_end_longtable_for_licenses(os);
933	      } have_tab = 0;
934	      if(!(have_chap)) {
935		dk3stream_c8_fputs(os, itadmin_license_c8_kw[28]);
936		itadmin_tool_write_user_latex_short(job, os, us);
937		dk3stream_c8_fputs(os, itadmin_license_c8_kw[29]);
938		itadmin_tool_write_user_latex_long(job, os, us);
939		dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
940		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
941	      } have_chap = 1;
942	      if(!(have_sec)) {
943		dk3stream_c8_fputs(os, itadmin_license_c8_kw[30]);
944      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[60], ie);
945		dk3stream_c8_fputs(os, itadmin_license_c8_kw[29]);
946      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[61], ie);
947		dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
948		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
949      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[64], ie);
950		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
951      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[65], ie);
952		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
953      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[66], ie);
954		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
955	      } have_sec = 1;
956	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[10]);
957	      dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pprod);
958	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
959	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
960	    } break;
961	    default: {
962              if(have_tab) {
963	        dk3stream_c8_fputs(os, itadmin_license_c8_kw[23]);
964                dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
965	      }
966	    } break;
967	  }
968	  if(!(have_tab)) {
969	    itadmin_license_start_longtable_for_licenses(os);
970	    have_tab = 1;
971	  }
972	  itadmin_license_write_license(job, os, li, pman, pprod, 0, 0, 0, 0, 0);
973	  prev_man = pman; prev_prod = pprod;
974	}
975      }
976      if(have_tab) {
977        itadmin_license_end_longtable_for_licenses(os);
978      }
979      if(have_sec) {
980        dk3stream_c8_fputs(os, itadmin_license_c8_kw[6]);
981	dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
982      }
983      /*
984    	  Licenses used on other users computers
985      */
986      have_sec = 0; have_tab = 0;
987      dk3sto_it_reset(us->i_li);
988      prev_man = NULL; prev_prod = NULL;
989      while(NULL != (li = (itadmin_license *)dk3sto_it_next(us->i_li))) {
990        if(li->host) {
991	  pman = itadmin_license_get_manufacturer(li);
992	  pprod = itadmin_license_get_product(li);
993	  switch(itadmin_license_change_level(pman,prev_man,pprod,prev_prod))
994	  {
995	    case 2: {	/* Manufacturer changed */
996	      if(have_tab) {
997	        itadmin_license_end_longtable_for_licenses(os);
998	      } have_tab = 0;
999	      if(!(have_chap)) {
1000		dk3stream_c8_fputs(os, itadmin_license_c8_kw[28]);
1001		itadmin_tool_write_user_latex_short(job, os, us);
1002		dk3stream_c8_fputs(os, itadmin_license_c8_kw[29]);
1003		itadmin_tool_write_user_latex_long(job, os, us);
1004		dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1005		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1006	      } have_chap = 1;
1007	      if(!(have_sec)) {
1008		dk3stream_c8_fputs(os, itadmin_license_c8_kw[30]);
1009      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[62], ie);
1010		dk3stream_c8_fputs(os, itadmin_license_c8_kw[29]);
1011      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[63], ie);
1012		dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1013		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1014      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[67], ie);
1015		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1016      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[68], ie);
1017		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1018      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[69], ie);
1019		dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
1020		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1021		dk3stream_c8_fputs(os, itadmin_license_c8_kw[31]);
1022      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[70], ie);
1023		dk3stream_c8_fputs(os, itadmin_license_c8_kw[32]);
1024      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[71], ie);
1025		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1026      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[72], ie);
1027		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1028      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[73], ie);
1029		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1030      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[74], ie);
1031		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1032      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[75], ie);
1033		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1034	      } have_sec = 1;
1035	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[9]);
1036	      dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pman);
1037	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1038	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1039	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[10]);
1040	      dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pprod);
1041	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1042	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1043	    } break;
1044	    case 1: {	/* Product changed */
1045	      if(have_tab) {
1046	        itadmin_license_end_longtable_for_licenses(os);
1047	      } have_tab = 0;
1048	      if(!(have_chap)) {
1049		dk3stream_c8_fputs(os, itadmin_license_c8_kw[28]);
1050		itadmin_tool_write_user_latex_short(job, os, us);
1051		dk3stream_c8_fputs(os, itadmin_license_c8_kw[29]);
1052		itadmin_tool_write_user_latex_long(job, os, us);
1053		dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1054		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1055	      } have_chap = 1;
1056	      if(!(have_sec)) {
1057		dk3stream_c8_fputs(os, itadmin_license_c8_kw[30]);
1058      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[62], ie);
1059		dk3stream_c8_fputs(os, itadmin_license_c8_kw[29]);
1060      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[63], ie);
1061		dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1062		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1063      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[67], ie);
1064		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1065      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[68], ie);
1066		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1067      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[69], ie);
1068		dk3stream_c8_fputs(os, itadmin_license_c8_kw[26]);
1069		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1070		dk3stream_c8_fputs(os, itadmin_license_c8_kw[31]);
1071      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[70], ie);
1072		dk3stream_c8_fputs(os, itadmin_license_c8_kw[32]);
1073      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[71], ie);
1074		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1075      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[72], ie);
1076		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1077      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[73], ie);
1078		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1079      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[74], ie);
1080		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1081      		dk3uc2lat_stputs(job->uc2l, os, (job->msg)[75], ie);
1082		dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1083	      } have_sec = 1;
1084	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[10]);
1085	      dk3uc2lat_c8_utf8_stputs(job->uc2l, os, pprod);
1086	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1087	      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1088	    } break;
1089	    default: {
1090              if(have_tab) {
1091	        dk3stream_c8_fputs(os, itadmin_license_c8_kw[23]);
1092                dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1093	      }
1094	    } break;
1095	  }
1096	  if(!(have_tab)) {
1097	    itadmin_license_start_longtable_for_licenses(os);
1098	    have_tab = 1;
1099	  }
1100	  itadmin_license_write_license(job, os, li, pman, pprod, 0, 0, 0, 1, 1);
1101	  prev_man = pman; prev_prod = pprod;
1102	}
1103      }
1104      if(have_tab) {
1105        itadmin_license_end_longtable_for_licenses(os);
1106      }
1107      if(have_sec) {
1108        dk3stream_c8_fputs(os, itadmin_license_c8_kw[6]);
1109	dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1110      }
1111    }
1112  } $? "- itadmin_license_write_user"
1113}
1114
1115
1116
1117/**	Write complete list of licenses.
1118	@param	job	Job structure.
1119	@param	os	Output stream.
1120*/
1121static
1122void
1123itadmin_license_write_complete_list(itadmin_job *job, dk3_stream_t *os)
1124{
1125  itadmin_license	*li;
1126  char const		*pman;
1127  char const		*pprod;
1128  int			 have_tab = 0;
1129  int			 ie;
1130  ie = dk3app_get_encoding(job->app);
1131  dk3sto_it_reset(job->i_lc);
1132  while(NULL != (li = (itadmin_license *)dk3sto_it_next(job->i_lc))) {
1133    if(!(have_tab)) {
1134      dk3stream_c8_fputs(os, itadmin_license_c8_kw[4]);
1135      dk3uc2lat_stputs(job->uc2l, os, (job->msg)[59], ie);
1136      dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1137      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1138      itadmin_license_start_longtable_for_licenses(os);
1139    } else {
1140      dk3stream_c8_fputs(os, itadmin_license_c8_kw[23]);
1141      dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1142    }
1143    have_tab = 1;
1144    pman = itadmin_license_get_manufacturer(li);
1145    pprod = itadmin_license_get_product(li);
1146    itadmin_license_write_license(job, os, li, pman, pprod, 1, 1, 1, 1, 1);
1147  }
1148  if(have_tab) {
1149    itadmin_license_end_longtable_for_licenses(os);
1150  }
1151}
1152
1153
1154
1155/**	Write license report to file.
1156	@param	job	Job structure.
1157	@param	os	Output stream.
1158*/
1159static
1160void
1161itadmin_license_write_file(itadmin_job *job, dk3_stream_t *os)
1162{
1163  int			 ie;
1164  ie = dk3app_get_encoding(job->app);
1165  if(job->ukoma) {
1166    itadmin_tool_write_section(os, itadmin_license_file_start1a);
1167  } else {
1168    itadmin_tool_write_section(os, itadmin_license_file_start1b);
1169  }
1170  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1171  dk3stream_strputs(os, (job->msg)[2], ie);
1172  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1173  itadmin_tool_write_section(os, itadmin_license_file_start4);
1174  /* pdftitle */
1175  dk3stream_c8_fputs(os, itadmin_license_c8_kw[11]);
1176  dk3uc2lat_stputs(job->uc2l, os, (job->msg)[51], ie);
1177  dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1178  dk3stream_c8_fputs(os, itadmin_license_c8_kw[17]);
1179  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1180  /* pdfsubject */
1181  dk3stream_c8_fputs(os, itadmin_license_c8_kw[12]);
1182  dk3uc2lat_stputs(job->uc2l, os, (job->msg)[52], ie);
1183  dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1184  dk3stream_c8_fputs(os, itadmin_license_c8_kw[17]);
1185  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1186  /* pdfauthor */
1187  if(job->admn) {
1188    dk3stream_c8_fputs(os, itadmin_license_c8_kw[13]);
1189    dk3uc2lat_stputs(job->uc2l, os, job->admn, ie);
1190    dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1191    dk3stream_c8_fputs(os, itadmin_license_c8_kw[17]);
1192    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1193  }
1194  /* pdfcreator */
1195  dk3stream_c8_fputs(os, itadmin_license_c8_kw[14]);
1196  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1197  itadmin_tool_write_section(os, itadmin_license_file_start2);
1198  /* author */
1199  if(job->admn) {
1200    dk3stream_c8_fputs(os, itadmin_license_c8_kw[15]);
1201    dk3uc2lat_stputs(job->uc2l, os, job->admn, ie);
1202    dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1203    dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1204  }
1205  /* title */
1206  dk3stream_c8_fputs(os, itadmin_license_c8_kw[16]);
1207  dk3uc2lat_stputs(job->uc2l, os, (job->msg)[51], ie);
1208  dk3stream_c8_fputs(os, itadmin_license_c8_kw[5]);
1209  dk3stream_c8_fputs(os, itadmin_license_c8_kw[0]);
1210  if(job->ukoma) {
1211    itadmin_tool_write_section(os, itadmin_license_file_start3a);
1212  }
1213  itadmin_tool_write_section(os, itadmin_license_file_start3);
1214  itadmin_license_write_available(job, os);
1215  itadmin_license_write_user(job, os);
1216  itadmin_license_write_complete_list(job, os);
1217  dk3uc2lat_final_report(job->uc2l, os);
1218  itadmin_tool_write_section(os, itadmin_license_file_end);
1219}
1220
1221
1222
1223int
1224itadmin_license_report(itadmin_job *job)
1225{
1226  FILE		*fipo;
1227  dk3_stream_t	*os;
1228  int		 back = 0;
1229  $? "+ itadmin_license_report"
1230  fipo = dk3sf_c8_fopen_app(
1231    itadmin_license_c8_kw[2],
1232    itadmin_license_c8_kw[3],
1233    job->app
1234  );
1235  if(fipo) {
1236    os = dk3stream_open_file_app(fipo, DK3_STREAM_FLAG_WRITE, job->app);
1237    if(os) {
1238      back = 1;
1239      itadmin_license_write_file(job, os);
1240      dk3stream_close(os);
1241    }
1242#if DK3_CHAR_SIZE == 1
1243    if(!dk3sf_fclose_fn_app(fipo, itadmin_license_c8_kw[2], job->app)) {
1244      back = 0;
1245    }
1246#else
1247    if(!dk3sf_fclose_fn_app(fipo, NULL, job->app)) {
1248      back = 0;
1249    }
1250#endif
1251  }
1252  $? "-	itadmin_license_report %d", back
1253  return back;
1254}
1255
1256
1257