2016-12-21 00:09:00 +08:00
|
|
|
#! /opt/openoffice4/program/python
|
|
|
|
# -*- coding: utf-8 -*-
|
2020-08-10 22:19:15 +08:00
|
|
|
# OpenOffice mobile presentation controller, as Python
|
2016-12-21 00:09:00 +08:00
|
|
|
# by imacat <imacat@mail.imacat.idv.tw>, 2014-02-28
|
|
|
|
|
2017-04-13 13:59:13 +08:00
|
|
|
# Copyright (c) 2016 imacat.
|
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
# limitations under the License.
|
|
|
|
|
|
|
|
"""Controls OpenOffice presentation with mobile devices.
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
from __future__ import print_function
|
2020-08-10 22:19:15 +08:00
|
|
|
|
|
|
|
import BaseHTTPServer
|
2017-04-13 13:59:13 +08:00
|
|
|
import argparse
|
2016-12-21 00:09:00 +08:00
|
|
|
import os
|
|
|
|
import os.path
|
|
|
|
import ssl
|
2020-08-10 22:19:15 +08:00
|
|
|
import sys
|
2016-12-21 00:09:00 +08:00
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
|
|
def append_uno_path():
|
2017-04-13 13:59:13 +08:00
|
|
|
"""Append the path of the uno module to the import path."""
|
2016-12-21 00:09:00 +08:00
|
|
|
|
|
|
|
for p in sys.path:
|
|
|
|
if os.path.exists(os.path.join(p, "uno.py")):
|
|
|
|
return
|
|
|
|
# For uno.py on MacOS
|
2020-08-10 22:19:15 +08:00
|
|
|
candidate = "/Applications/OpenOffice.app/Contents/MacOS"
|
|
|
|
if os.path.exists(os.path.join(candidate, "uno.py")):
|
|
|
|
sys.path.append(candidate)
|
2016-12-21 00:09:00 +08:00
|
|
|
return
|
2017-04-14 09:20:42 +08:00
|
|
|
# Find uno.py for MS-Windows
|
2020-08-10 22:19:15 +08:00
|
|
|
candidate = sys.executable
|
|
|
|
while candidate != os.path.dirname(candidate):
|
|
|
|
candidate = os.path.dirname(candidate)
|
|
|
|
if os.path.exists(os.path.join(candidate, "uno.py")):
|
|
|
|
sys.path.append(candidate)
|
2016-12-21 00:09:00 +08:00
|
|
|
return
|
|
|
|
|
2020-08-10 22:19:15 +08:00
|
|
|
|
2016-12-21 00:09:00 +08:00
|
|
|
append_uno_path()
|
|
|
|
import uno
|
|
|
|
from com.sun.star.beans import PropertyValue
|
|
|
|
from com.sun.star.lang import DisposedException
|
|
|
|
from com.sun.star.connection import NoConnectException
|
|
|
|
|
|
|
|
|
2017-04-13 13:59:13 +08:00
|
|
|
def main():
|
|
|
|
"""The main program."""
|
|
|
|
global args
|
|
|
|
|
|
|
|
# Parses the arguments
|
|
|
|
parse_args()
|
|
|
|
|
2020-08-10 22:19:15 +08:00
|
|
|
run(args.doc_file, args.www_port, args.use_ssl)
|
2017-04-13 13:59:13 +08:00
|
|
|
|
|
|
|
|
|
|
|
def parse_args():
|
|
|
|
"""Parse the arguments."""
|
|
|
|
global args
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser(
|
|
|
|
description=("Synchronize the local Basic scripts"
|
|
|
|
" with OpenOffice/LibreOffice Basic."))
|
|
|
|
parser.add_argument(
|
2020-08-10 22:19:15 +08:00
|
|
|
"doc_file", metavar="PRESENTATION", type=presentation_doc,
|
|
|
|
help="The presentation document to play.")
|
2017-04-13 13:59:13 +08:00
|
|
|
parser.add_argument(
|
2020-08-10 22:19:15 +08:00
|
|
|
"-w", "--www-port", metavar="N", type=int, default=53177,
|
2017-04-13 13:59:13 +08:00
|
|
|
help=("The TCP port for the web presentation controller "
|
|
|
|
"(default: %(default)s)"))
|
|
|
|
parser.add_argument(
|
|
|
|
"-p", "--port", metavar="N", type=int, default=2002,
|
|
|
|
help=("The TCP port to communicate with "
|
|
|
|
"OpenOffice/LibreOffice with (default: %(default)s)"))
|
|
|
|
parser.add_argument(
|
|
|
|
"-v", "--version", action="version", version="%(prog)s 1.0")
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
# Obtain the absolute path
|
2020-08-10 22:19:15 +08:00
|
|
|
args.doc_file = os.path.abspath(args.doc_file)
|
2017-04-13 13:59:13 +08:00
|
|
|
|
|
|
|
# Check whether we are using SSL.
|
|
|
|
# TODO: Changed to an option or find the certificates automatically
|
2020-08-10 22:19:15 +08:00
|
|
|
doc_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
|
|
|
|
key_file = os.path.join(doc_dir, "server.key.pem")
|
|
|
|
crt_file = os.path.join(doc_dir, "server.crt.pem")
|
|
|
|
args.use_ssl = False
|
|
|
|
if os.path.isfile(key_file) and os.path.isfile(crt_file):
|
|
|
|
args.use_ssl = (key_file, crt_file)
|
2017-04-13 13:59:13 +08:00
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
2020-08-10 22:19:15 +08:00
|
|
|
def presentation_doc(doc_file):
|
2017-04-14 09:20:42 +08:00
|
|
|
"""Check the supplied presentation document argument.
|
2017-04-13 13:59:13 +08:00
|
|
|
|
|
|
|
Arguments:
|
2020-08-10 22:19:15 +08:00
|
|
|
doc_file: The supplied presentation document argument.
|
2017-04-13 13:59:13 +08:00
|
|
|
|
|
|
|
Returns:
|
|
|
|
The supplied presentation document argument.
|
|
|
|
"""
|
2020-08-10 22:19:15 +08:00
|
|
|
s = doc_file.lower()
|
2017-04-13 13:59:13 +08:00
|
|
|
if not (s.endswith(".odp")
|
|
|
|
or s.endswith(".sxi")
|
|
|
|
or s.endswith(".ppt")
|
|
|
|
or s.endswith(".pptx")):
|
|
|
|
raise argparse.ArgumentTypeError(
|
2020-08-10 22:19:15 +08:00
|
|
|
"%s: Not a presentation document" % doc_file)
|
|
|
|
path = os.path.abspath(doc_file)
|
2017-04-13 13:59:13 +08:00
|
|
|
if not os.path.exists(path):
|
|
|
|
raise argparse.ArgumentTypeError(
|
2020-08-10 22:19:15 +08:00
|
|
|
"%s: File does not exit" % doc_file)
|
2017-04-13 13:59:13 +08:00
|
|
|
if not os.path.isfile(path):
|
|
|
|
raise argparse.ArgumentTypeError(
|
2020-08-10 22:19:15 +08:00
|
|
|
"%s: Not a file" % doc_file)
|
|
|
|
return doc_file
|
2017-04-13 13:59:13 +08:00
|
|
|
|
|
|
|
|
2020-08-10 22:19:15 +08:00
|
|
|
def run(doc, port, use_ssl):
|
2017-04-13 13:59:13 +08:00
|
|
|
"""
|
|
|
|
Start the presentation and run the web presentation controller.
|
|
|
|
"""
|
|
|
|
global oo
|
|
|
|
|
|
|
|
print("Listen on port %d" % port)
|
|
|
|
oo = PresentationController(doc)
|
|
|
|
oo.check_valid()
|
|
|
|
server_address = ("", port)
|
|
|
|
httpd = BaseHTTPServer.HTTPServer(server_address, MyHTTPRequestHandler)
|
2020-08-10 22:19:15 +08:00
|
|
|
if use_ssl is not False:
|
2017-04-13 13:59:13 +08:00
|
|
|
httpd.socket = ssl.wrap_socket(
|
|
|
|
httpd.socket,
|
2020-08-10 22:19:15 +08:00
|
|
|
keyfile=use_ssl[0],
|
|
|
|
certfile=use_ssl[1],
|
2017-04-13 13:59:13 +08:00
|
|
|
server_side=True)
|
|
|
|
httpd.serve_forever()
|
|
|
|
|
|
|
|
|
2016-12-21 00:09:00 +08:00
|
|
|
class PresentationController:
|
|
|
|
"""The OpenOffice mobile presentation controller."""
|
2020-08-10 22:19:15 +08:00
|
|
|
WIN_DETACHED_PROCESS = 0x00000008
|
2016-12-21 00:09:00 +08:00
|
|
|
|
2020-08-10 22:19:15 +08:00
|
|
|
def __init__(self, doc_file):
|
2017-04-13 13:59:13 +08:00
|
|
|
"""Initialize the object."""
|
2020-08-10 22:19:15 +08:00
|
|
|
self.file = doc_file
|
2017-04-13 13:59:13 +08:00
|
|
|
self.port = 2002
|
2016-12-21 00:09:00 +08:00
|
|
|
self.bootstrap_context = None
|
|
|
|
self.service_manager = None
|
|
|
|
self.desktop = None
|
|
|
|
self.doc = None
|
|
|
|
|
|
|
|
def check_valid(self):
|
2017-04-13 13:59:13 +08:00
|
|
|
"""
|
|
|
|
Check the validity of the connection and the opened
|
|
|
|
document.
|
|
|
|
"""
|
2016-12-21 00:09:00 +08:00
|
|
|
try:
|
|
|
|
presentation = self.doc.getPresentation()
|
|
|
|
except (AttributeError, DisposedException):
|
|
|
|
try:
|
|
|
|
self.bootstrap_context.getServiceManager()
|
|
|
|
except (AttributeError, DisposedException):
|
2017-04-13 14:20:06 +08:00
|
|
|
self.__connect()
|
2016-12-21 00:09:00 +08:00
|
|
|
self.open()
|
|
|
|
presentation = self.doc.getPresentation()
|
|
|
|
if not presentation.isRunning():
|
|
|
|
presentation.start()
|
|
|
|
|
2017-04-13 14:00:08 +08:00
|
|
|
def open(self):
|
|
|
|
"""Open an office document."""
|
|
|
|
file_content_provider = self.service_manager.createInstance(
|
|
|
|
"com.sun.star.ucb.FileContentProvider")
|
|
|
|
url = file_content_provider.getFileURLFromSystemPath("", self.file)
|
|
|
|
enum = self.desktop.getComponents().createEnumeration()
|
|
|
|
while enum.hasMoreElements():
|
|
|
|
component = enum.nextElement()
|
|
|
|
if component.supportsService(
|
|
|
|
"com.sun.star.presentation.PresentationDocument"):
|
|
|
|
if component.getURL() == url:
|
|
|
|
self.doc = component
|
|
|
|
return
|
|
|
|
prop1 = PropertyValue()
|
|
|
|
prop1.Name = "ReadOnly"
|
|
|
|
prop1.Value = True
|
|
|
|
prop2 = PropertyValue()
|
|
|
|
prop2.Name = "MacroExecutionMode"
|
|
|
|
# com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE
|
|
|
|
prop2.Value = 2
|
|
|
|
self.doc = self.desktop.loadComponentFromURL(
|
|
|
|
url, "_default", 0, (prop2,))
|
|
|
|
if not self.doc.supportsService(
|
|
|
|
"com.sun.star.presentation.PresentationDocument"):
|
|
|
|
sys.stderr.write(self.file + ": not a presentation document.\n")
|
|
|
|
sys.exit(1)
|
|
|
|
return
|
|
|
|
|
|
|
|
def goto_next_slide(self):
|
|
|
|
"""Go to the next slide."""
|
|
|
|
self.doc.getPresentation().getController().gotoNextSlide()
|
|
|
|
return
|
|
|
|
|
|
|
|
def goto_prev_slide(self):
|
|
|
|
"""Go to the previous slide."""
|
|
|
|
self.doc.getPresentation().getController().gotoPreviousSlide()
|
|
|
|
return
|
|
|
|
|
2017-04-13 14:20:06 +08:00
|
|
|
def __connect(self):
|
|
|
|
"""Connect to the running OpenOffice/LibreOffice process.
|
|
|
|
|
|
|
|
Run OpenOffice/LibreOffice in server listening mode if it is
|
|
|
|
not running yet.
|
|
|
|
"""
|
2017-04-14 09:20:42 +08:00
|
|
|
# Obtain the local context
|
2017-04-13 14:20:06 +08:00
|
|
|
local_context = uno.getComponentContext()
|
2017-04-14 09:20:42 +08:00
|
|
|
# Obtain the local service manager
|
2017-04-13 14:20:06 +08:00
|
|
|
local_service_manager = local_context.getServiceManager()
|
2017-04-14 09:20:42 +08:00
|
|
|
# Obtain the URL resolver
|
2017-04-13 14:20:06 +08:00
|
|
|
url_resolver = local_service_manager.createInstanceWithContext(
|
|
|
|
"com.sun.star.bridge.UnoUrlResolver", local_context)
|
2017-04-14 09:20:42 +08:00
|
|
|
# Obtain the context
|
2017-04-13 14:20:06 +08:00
|
|
|
url = ("uno:socket,host=localhost,port=%d;"
|
|
|
|
"urp;StarOffice.ComponentContext") % self.port
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
self.bootstrap_context = url_resolver.resolve(url)
|
|
|
|
except NoConnectException:
|
|
|
|
self.__start_oo()
|
|
|
|
else:
|
|
|
|
break
|
2017-04-14 09:20:42 +08:00
|
|
|
# Obtain the service manager
|
2017-04-13 14:20:06 +08:00
|
|
|
self.service_manager = self.bootstrap_context.getServiceManager()
|
2017-04-14 09:20:42 +08:00
|
|
|
# Obtain the desktop service
|
2017-04-13 14:20:06 +08:00
|
|
|
self.desktop = self.service_manager.createInstanceWithContext(
|
|
|
|
"com.sun.star.frame.Desktop", self.bootstrap_context)
|
|
|
|
|
2017-04-13 13:59:13 +08:00
|
|
|
def __start_oo(self):
|
|
|
|
"""Start OpenOffice/LibreOffice in server listening mode."""
|
2016-12-21 00:09:00 +08:00
|
|
|
# For MS-Windows, which does not have fork()
|
|
|
|
if os.name == "nt":
|
|
|
|
from subprocess import Popen
|
2017-04-13 13:59:13 +08:00
|
|
|
soffice = os.path.join(
|
|
|
|
os.path.dirname(uno.__file__), "soffice.exe")
|
|
|
|
Popen([soffice,
|
|
|
|
"-accept=socket,host=localhost,port=%d;urp;" %
|
|
|
|
self.port],
|
2020-08-10 22:19:15 +08:00
|
|
|
close_fds=True, creationflags=self.WIN_DETACHED_PROCESS)
|
2016-12-21 00:09:00 +08:00
|
|
|
time.sleep(2)
|
|
|
|
return
|
|
|
|
|
2017-04-13 13:59:13 +08:00
|
|
|
# For POSIX systems, including Linux and MacOSX
|
2016-12-21 00:09:00 +08:00
|
|
|
try:
|
|
|
|
pid = os.fork()
|
|
|
|
except OSError:
|
2017-04-13 13:59:13 +08:00
|
|
|
print("Failed to fork().", file=sys.stderr)
|
2016-12-21 00:09:00 +08:00
|
|
|
sys.exit(1)
|
|
|
|
if pid != 0:
|
|
|
|
time.sleep(2)
|
|
|
|
return
|
|
|
|
os.setsid()
|
2017-04-13 13:59:13 +08:00
|
|
|
soffice = self.__find_posix_soffice()
|
|
|
|
if soffice is None:
|
|
|
|
print("Failed to find the "
|
|
|
|
"OpenOffice/LibreOffice installation.",
|
|
|
|
file=sys.stderr)
|
|
|
|
sys.exit(1)
|
|
|
|
param = "-accept=socket,host=localhost,port=%d;urp;" % \
|
|
|
|
self.port
|
|
|
|
# LibreOffice on POSIX systems uses --accept instead of
|
|
|
|
# -accept now.
|
|
|
|
if self.__is_soffice_lo(soffice):
|
|
|
|
param = "-" + param
|
2016-12-21 00:09:00 +08:00
|
|
|
try:
|
2017-04-13 13:59:13 +08:00
|
|
|
os.execl(soffice, soffice, param)
|
2016-12-21 00:09:00 +08:00
|
|
|
except OSError:
|
2017-04-13 13:59:13 +08:00
|
|
|
print("%s: Failed to run the"
|
|
|
|
" OpenOffice/LibreOffice server." % soffice,
|
|
|
|
file=sys.stderr)
|
2016-12-21 00:09:00 +08:00
|
|
|
sys.exit(1)
|
|
|
|
|
2020-08-10 22:19:15 +08:00
|
|
|
@staticmethod
|
|
|
|
def __find_posix_soffice():
|
2017-04-13 13:59:13 +08:00
|
|
|
"""Find soffice on POSIX systems (Linux or MacOSX).
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
The found soffice executable, or None if not found.
|
|
|
|
"""
|
2017-04-14 09:20:42 +08:00
|
|
|
# Check soffice in the same directory of uno.py
|
2017-04-13 13:59:13 +08:00
|
|
|
# This works for Linux OpenOffice/LibreOffice local
|
|
|
|
# installation, and OpenOffice on MacOSX.
|
|
|
|
soffice = os.path.join(
|
|
|
|
os.path.dirname(uno.__file__), "soffice")
|
|
|
|
if os.path.exists(soffice):
|
|
|
|
return soffice
|
|
|
|
|
|
|
|
# Now we have LibreOffice on MacOSX and Linux
|
2020-08-10 22:19:15 +08:00
|
|
|
# OpenOffice/LibreOffice vendor installation.
|
2017-04-13 13:59:13 +08:00
|
|
|
|
|
|
|
# LibreOffice on MacOSX.
|
|
|
|
soffice = "/Applications/LibreOffice.app/Contents/MacOS/soffice"
|
|
|
|
if os.path.exists(soffice):
|
|
|
|
return soffice
|
|
|
|
|
2020-08-10 22:19:15 +08:00
|
|
|
# Linux OpenOffice/LibreOffice vendor installation.
|
2017-04-13 13:59:13 +08:00
|
|
|
soffice = "/usr/bin/soffice"
|
|
|
|
if os.path.exists(soffice):
|
|
|
|
return soffice
|
|
|
|
|
|
|
|
# Not found
|
|
|
|
return None
|
|
|
|
|
2020-08-10 22:19:15 +08:00
|
|
|
@staticmethod
|
|
|
|
def __is_soffice_lo(soffice):
|
2017-04-13 13:59:13 +08:00
|
|
|
"""Check whether the soffice executable is LibreOffice.
|
|
|
|
|
|
|
|
LibreOffice on POSIX systems accepts "--accept" instead of
|
|
|
|
"-accept" now.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
True if soffice is LibreOffice, or False otherwise.
|
|
|
|
"""
|
|
|
|
# This works for most cases.
|
|
|
|
if soffice.lower().find("libreoffice") != -1:
|
|
|
|
return True
|
|
|
|
|
2017-04-14 09:20:42 +08:00
|
|
|
# Check the symbolic link at /usr/bin/soffice
|
2017-04-13 13:59:13 +08:00
|
|
|
if soffice == "/usr/bin/soffice" and os.path.islink(soffice):
|
|
|
|
if os.readlink(soffice).lower().find("libreoffice") != -1:
|
|
|
|
return True
|
|
|
|
|
|
|
|
# Not found
|
|
|
|
return False
|
|
|
|
|
2016-12-21 00:09:00 +08:00
|
|
|
|
|
|
|
class MyHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
|
|
|
"""The local HTTP request handler."""
|
2017-04-13 13:59:13 +08:00
|
|
|
|
2016-12-21 00:09:00 +08:00
|
|
|
def do_GET(self):
|
2017-04-13 13:59:13 +08:00
|
|
|
"""Handle the GET requests."""
|
2016-12-21 00:09:00 +08:00
|
|
|
oo.check_valid()
|
|
|
|
html = """<?xml version="1.0" encoding="UTF-8" ?>
|
|
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
|
|
|
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
|
|
|
<head>
|
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.5" />
|
|
|
|
<style type="text/css">
|
|
|
|
.pocket input {
|
|
|
|
font-size: 8em;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
<title>OpenOffice Presentation Controller</title>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
|
|
|
|
<div class="pocket">
|
|
|
|
<form action="/next" method="POST">
|
|
|
|
<input type="submit" value="▲" />
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="pocket">
|
|
|
|
<form action="/prev" method="POST">
|
|
|
|
<input type="submit" value="▼" />
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</body>"""
|
|
|
|
self.send_response(200)
|
|
|
|
self.send_header("Content-Type", "text/html; charset=UTF-8")
|
|
|
|
self.send_header("Content-Length", len(html))
|
|
|
|
self.end_headers()
|
|
|
|
self.wfile.write(html)
|
|
|
|
|
|
|
|
def do_POST(self):
|
2017-04-13 13:59:13 +08:00
|
|
|
"""Handle the POST requests."""
|
2016-12-21 00:09:00 +08:00
|
|
|
oo.check_valid()
|
|
|
|
if self.path == "/next":
|
|
|
|
oo.goto_next_slide()
|
|
|
|
elif self.path == "/prev":
|
|
|
|
oo.goto_prev_slide()
|
|
|
|
html = """<?xml version="1.0" encoding="US-ASCII" ?>
|
|
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
|
|
|
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
|
|
|
<head>
|
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII" />
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.5" />
|
|
|
|
<title>303 See Others</title>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<h1>303 See Others</h1>
|
|
|
|
<p>Please follow <a href="/">this location</a>.</p>
|
|
|
|
</body>
|
|
|
|
</html>"""
|
|
|
|
self.send_response(303)
|
|
|
|
self.send_header("Location", "/")
|
|
|
|
self.send_header("Content-Type", "text/html; charset=US-ASCII")
|
|
|
|
self.send_header("Content-Length", len(html))
|
|
|
|
self.end_headers()
|
|
|
|
self.wfile.write(html)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2017-04-13 13:59:13 +08:00
|
|
|
main()
|
|
|
|
"""
|
2016-12-21 00:09:00 +08:00
|
|
|
if len(sys.argv) != 2:
|
|
|
|
sys.stderr.write("Please specify the presentation document.\n")
|
|
|
|
sys.exit(1)
|
2020-08-10 22:19:15 +08:00
|
|
|
doc_file = os.path.abspath(sys.argv[1])
|
|
|
|
s = doc_file.lower()
|
2016-12-21 00:09:00 +08:00
|
|
|
if not (s.endswith(".odp")
|
|
|
|
or s.endswith(".sxi")
|
|
|
|
or s.endswith(".ppt")
|
|
|
|
or s.endswith(".pptx")):
|
2020-08-10 22:19:15 +08:00
|
|
|
sys.stderr.write(doc_file + ": not a presentation document.\n")
|
2016-12-21 00:09:00 +08:00
|
|
|
sys.exit(1)
|
2020-08-10 22:19:15 +08:00
|
|
|
if not os.path.exists(doc_file):
|
|
|
|
sys.stderr.write(doc_file + ": file does not exist.\n")
|
2016-12-21 00:09:00 +08:00
|
|
|
sys.exit(1)
|
2020-08-10 22:19:15 +08:00
|
|
|
if not os.path.isfile(doc_file):
|
|
|
|
sys.stderr.write(doc_file + ": file does not exist.\n")
|
2016-12-21 00:09:00 +08:00
|
|
|
sys.exit(1)
|
2020-08-10 22:19:15 +08:00
|
|
|
my_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
|
|
|
|
key_file = os.path.join(my_dir, "server.key.pem")
|
|
|
|
crt_file = os.path.join(my_dir, "server.crt.pem")
|
|
|
|
use_ssl = False
|
|
|
|
if os.path.isfile(key_file) and os.path.isfile(crt_file):
|
|
|
|
use_ssl = (key_file, crt_file)
|
|
|
|
oo = PresentationController(doc_file)
|
2016-12-21 00:09:00 +08:00
|
|
|
run()
|
2017-04-13 13:59:13 +08:00
|
|
|
"""
|