+sub is_xvfb_running {
+ $main::lxdebug->enter_sub();
+
+ my ($self) = @_;
+
+ local *IN;
+ my $dfname = $self->{"userspath"} . "/xvfb_display";
+ my $display;
+
+ $main::lxdebug->message(LXDebug::DEBUG2, " Looking for $dfname\n");
+ if ((-f $dfname) && open(IN, $dfname)) {
+ my $pid = <IN>;
+ chomp($pid);
+ $display = <IN>;
+ chomp($display);
+ my $xauthority = <IN>;
+ chomp($xauthority);
+ close(IN);
+
+ $main::lxdebug->message(LXDebug::DEBUG2, " found with $pid and $display\n");
+
+ if ((! -d "/proc/$pid") || !open(IN, "/proc/$pid/cmdline")) {
+ $main::lxdebug->message(LXDebug::DEBUG2, " no/wrong process #1\n");
+ unlink($dfname, $xauthority);
+ $main::lxdebug->leave_sub();
+ return undef;
+ }
+ my $line = <IN>;
+ close(IN);
+ if ($line !~ /xvfb/i) {
+ $main::lxdebug->message(LXDebug::DEBUG2, " no/wrong process #2\n");
+ unlink($dfname, $xauthority);
+ $main::lxdebug->leave_sub();
+ return undef;
+ }
+
+ $ENV{"XAUTHORITY"} = $xauthority;
+ $ENV{"DISPLAY"} = $display;
+ } else {
+ $main::lxdebug->message(LXDebug::DEBUG2, " not found\n");
+ }
+
+ $main::lxdebug->leave_sub();
+
+ return $display;
+}
+
+sub spawn_xvfb {
+ $main::lxdebug->enter_sub();
+
+ my ($self) = @_;
+
+ $main::lxdebug->message(LXDebug::DEBUG2, "spawn_xvfb()\n");
+
+ my $display = $self->is_xvfb_running();
+
+ if ($display) {
+ $main::lxdebug->leave_sub();
+ return $display;
+ }
+
+ $display = 99;
+ while ( -f "/tmp/.X${display}-lock") {
+ $display++;
+ }
+ $display = ":${display}";
+ $main::lxdebug->message(LXDebug::DEBUG2, " display $display\n");
+
+ my $mcookie = `mcookie`;
+ die("Installation error: mcookie not found.") if ($? != 0);
+ chomp($mcookie);
+
+ $main::lxdebug->message(LXDebug::DEBUG2, " mcookie $mcookie\n");
+
+ my $xauthority = "/tmp/.Xauthority-" . $$ . "-" . time() . "-" . int(rand(9999999));
+ $ENV{"XAUTHORITY"} = $xauthority;
+
+ $main::lxdebug->message(LXDebug::DEBUG2, " xauthority $xauthority\n");
+
+ system("xauth add \"${display}\" . \"${mcookie}\"");
+ if ($? != 0) {
+ $self->{"error"} = "Conversion to PDF failed because OpenOffice could not be started (xauth: $!)";
+ $main::lxdebug->leave_sub();
+ return undef;
+ }
+
+ $main::lxdebug->message(LXDebug::DEBUG2, " about to fork()\n");
+
+ my $pid = fork();
+ if (0 == $pid) {
+ $main::lxdebug->message(LXDebug::DEBUG2, " Child execing\n");
+ exec($main::xvfb_bin, $display, "-screen", "0", "640x480x8", "-nolisten", "tcp");
+ }
+ sleep(3);
+ $main::lxdebug->message(LXDebug::DEBUG2, " parent dont sleeping\n");
+
+ local *OUT;
+ my $dfname = $self->{"userspath"} . "/xvfb_display";
+ if (!open(OUT, ">$dfname")) {
+ $self->{"error"} = "Conversion to PDF failed because OpenOffice could not be started ($dfname: $!)";
+ unlink($xauthority);
+ kill($pid);
+ $main::lxdebug->leave_sub();
+ return undef;
+ }
+ print(OUT "$pid\n$display\n$xauthority\n");
+ close(OUT);
+
+ $main::lxdebug->message(LXDebug::DEBUG2, " parent re-testing\n");
+
+ if (!$self->is_xvfb_running()) {
+ $self->{"error"} = "Conversion to PDF failed because OpenOffice could not be started.";
+ unlink($xauthority, $dfname);
+ kill($pid);
+ $main::lxdebug->leave_sub();
+ return undef;
+ }
+
+ $main::lxdebug->message(LXDebug::DEBUG2, " spawn OK\n");
+
+ $main::lxdebug->leave_sub();
+
+ return $display;
+}
+
+sub is_openoffice_running {
+ $main::lxdebug->enter_sub();
+
+ system("./scripts/oo-uno-test-conn.py $main::openofficeorg_daemon_port " .
+ "> /dev/null 2> /dev/null");
+ my $res = $? == 0;
+ $main::lxdebug->message(LXDebug::DEBUG2, " is_openoffice_running(): $?\n");
+
+ $main::lxdebug->leave_sub();
+
+ return $res;
+}
+
+sub spawn_openoffice {
+ $main::lxdebug->enter_sub();
+
+ my ($self) = @_;
+
+ $main::lxdebug->message(LXDebug::DEBUG2, "spawn_openoffice()\n");
+
+ my ($try, $spawned_oo, $res);
+
+ $res = 0;
+ for ($try = 0; $try < 15; $try++) {
+ if ($self->is_openoffice_running()) {
+ $res = 1;
+ last;
+ }
+
+ if (!$spawned_oo) {
+ my $pid = fork();
+ if (0 == $pid) {
+ $main::lxdebug->message(LXDebug::DEBUG2, " Child daemonizing\n");
+ chdir('/');
+ open(STDIN, '/dev/null');
+ open(STDOUT, '>/dev/null');
+ my $new_pid = fork();
+ exit if ($new_pid);
+ my $ssres = setsid();
+ $main::lxdebug->message(LXDebug::DEBUG2, " Child execing\n");
+ my @cmdline = ($main::openofficeorg_writer_bin,
+ "-minimized", "-norestore", "-nologo", "-nolockcheck",
+ "-headless",
+ "-accept=socket,host=localhost,port=" .
+ $main::openofficeorg_daemon_port . ";urp;");
+ exec(@cmdline);
+ }
+
+ $main::lxdebug->message(LXDebug::DEBUG2, " Parent after fork\n");
+ $spawned_oo = 1;
+ sleep(3);
+ }
+
+ sleep($try >= 5 ? 2 : 1);
+ }
+
+ if (!$res) {
+ $self->{"error"} = "Conversion from OpenDocument to PDF failed because " .
+ "OpenOffice could not be started.";
+ }
+
+ $main::lxdebug->leave_sub();
+
+ return $res;
+}
+