# Path: pypot/server/server.py
# class AbstractServer(object):
#     def __init__(self, robot, host, port):
#         self.restful_robot = RESTRobot(robot)
#         self.host, self.port = host, port
# 
#     def run(self):
#         raise NotImplementedError
# 
# Path: pypot/utils/appdirs.py
# def user_data_dir(appname=None, appauthor=None, version=None, roaming=False):
#     r"""Return full path to the user-specific data dir for this application.
# 
#         "appname" is the name of application.
#             If None, just the system directory is returned.
#         "appauthor" (only used on Windows) is the name of the
#             appauthor or distributing body for this application. Typically
#             it is the owning company name. This falls back to appname. You may
#             pass False to disable it.
#         "version" is an optional version path element to append to the
#             path. You might want to use this if you want multiple versions
#             of your app to be able to run independently. If used, this
#             would typically be "<major>.<minor>".
#             Only applied when appname is present.
#         "roaming" (boolean, default False) can be set True to use the Windows
#             roaming appdata directory. That means that for users on a Windows
#             network setup for roaming profiles, this user data will be
#             sync'd on login. See
#             <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
#             for a discussion of issues.
# 
#     Typical user data directories are:
#         Mac OS X:               ~/Library/Application Support/<AppName>
#         Unix:                   ~/.local/share/<AppName>    # or in $XDG_DATA_HOME, if defined
#         Win XP (not roaming):   C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName>
#         Win XP (roaming):       C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>
#         Win 7  (not roaming):   C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>
#         Win 7  (roaming):       C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName>
# 
#     For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
#     That means, by default "~/.local/share/<AppName>".
#     """
#     if system == "win32":
#         if appauthor is None:
#             appauthor = appname
#         const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA"
#         path = os.path.normpath(_get_win_folder(const))
#         if appname:
#             if appauthor is not False:
#                 path = os.path.join(path, appauthor, appname)
#             else:
#                 path = os.path.join(path, appname)
#     elif system == 'darwin':
#         path = os.path.expanduser('~/Library/Application Support/')
#         if appname:
#             path = os.path.join(path, appname)
#     else:
#         path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share"))
#         if appname:
#             path = os.path.join(path, appname)
#     if appname and version:
#         path = os.path.join(path, version)
#     return path


import os
import re
import sys
import numpy
import cv2
import errno
import shutil
import bottle
import socket
import logging
import datetime
    import cgi
    import html
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from bottle import request
from bottle import response
from contextlib import closing
from ast import literal_eval as make_tuple
from .server import AbstractServer
from ..utils.appdirs import user_data_dir
    def apply(self, fn, context):
        def _enable_cors(*args, **kwargs):
            response.set_header('Access-Control-Allow-Origin', self.origin)
            response.set_header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            response.set_header('Access-Control-Allow-Headers', 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token')

            if request.method != 'OPTIONS':
                # actual request; reply with the actual response
                return fn(*args, **kwargs)

        return _enable_cors


class CacheBuster(object):
    """Add response headers to disable cache"""

    name = 'cache_buster'
    api = 2

    def apply(self, fn, context):
        def _ext(*args, **kwargs):
            response.set_header('Cache-control', 'no-store')
            return fn(*args, **kwargs)

        return _ext


class SnapRobotServer(AbstractServer):

    def __init__(self, robot, host='0.0.0.0', port='6969', quiet=True):

# Path: pypot/server/server.py
# class AbstractServer(object):
#     def __init__(self, robot, host, port):
#         self.restful_robot = RESTRobot(robot)
#         self.host, self.port = host, port
# 
#     def run(self):
#         raise NotImplementedError
# 
# Path: pypot/utils/appdirs.py
# def user_data_dir(appname=None, appauthor=None, version=None, roaming=False):
#     r"""Return full path to the user-specific data dir for this application.
# 
#         "appname" is the name of application.
#             If None, just the system directory is returned.
#         "appauthor" (only used on Windows) is the name of the
#             appauthor or distributing body for this application. Typically
#             it is the owning company name. This falls back to appname. You may
#             pass False to disable it.
#         "version" is an optional version path element to append to the
#             path. You might want to use this if you want multiple versions
#             of your app to be able to run independently. If used, this
#             would typically be "<major>.<minor>".
#             Only applied when appname is present.
#         "roaming" (boolean, default False) can be set True to use the Windows
#             roaming appdata directory. That means that for users on a Windows
#             network setup for roaming profiles, this user data will be
#             sync'd on login. See
#             <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
#             for a discussion of issues.
# 
#     Typical user data directories are:
#         Mac OS X:               ~/Library/Application Support/<AppName>
#         Unix:                   ~/.local/share/<AppName>    # or in $XDG_DATA_HOME, if defined
#         Win XP (not roaming):   C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName>
#         Win XP (roaming):       C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>
#         Win 7  (not roaming):   C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>
#         Win 7  (roaming):       C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName>
# 
#     For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
#     That means, by default "~/.local/share/<AppName>".
#     """
#     if system == "win32":
#         if appauthor is None:
#             appauthor = appname
#         const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA"
#         path = os.path.normpath(_get_win_folder(const))
#         if appname:
#             if appauthor is not False:
#                 path = os.path.join(path, appauthor, appname)
#             else:
#                 path = os.path.join(path, appname)
#     elif system == 'darwin':
#         path = os.path.expanduser('~/Library/Application Support/')
#         if appname:
#             path = os.path.join(path, appname)
#     else:
#         path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share"))
#         if appname:
#             path = os.path.join(path, appname)
#     if appname and version:
#         path = os.path.join(path, version)
#     return path


# Path: pypot/server/snap.py
import os
import re
import sys
import numpy
import cv2
import errno
import shutil
import bottle
import socket
import logging
import datetime
    import cgi
    import html
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from bottle import request
from bottle import response
from contextlib import closing
from ast import literal_eval as make_tuple
from .server import AbstractServer
from ..utils.appdirs import user_data_dir

    def apply(self, fn, context):
        def _enable_cors(*args, **kwargs):
            response.set_header('Access-Control-Allow-Origin', self.origin)
            response.set_header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            response.set_header('Access-Control-Allow-Headers', 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token')

            if request.method != 'OPTIONS':
                # actual request; reply with the actual response
                return fn(*args, **kwargs)

        return _enable_cors


class CacheBuster(object):
    """Add response headers to disable cache"""

    name = 'cache_buster'
    api = 2

    def apply(self, fn, context):
        def _ext(*args, **kwargs):
            response.set_header('Cache-control', 'no-store')
            return fn(*args, **kwargs)

        return _ext


class SnapRobotServer(AbstractServer):

    def __init__(self, robot, host='0.0.0.0', port='6969', quiet=True):

        AbstractServer.__init__(self, robot, host, port)