# HG changeset patch # User paulb # Date 1125009704 0 # Node ID 9e740ffc3ffd34d3fc4106436f4178fd58430d12 # Parent a6c7628d5a3760c11f26605f182774cb4e36d962 [project @ 2005-08-25 22:41:44 by paulb] Added a filesystem encoding setting so that files are accessed correctly on operating systems not supporting Unicode filenames. Tidied up usage of encodings. Removed redundant/erroneous session initialisation. diff -r a6c7628d5a37 -r 9e740ffc3ffd examples/Common/Calendar/__init__.py --- a/examples/Common/Calendar/__init__.py Thu Aug 25 22:40:33 2005 +0000 +++ b/examples/Common/Calendar/__init__.py Thu Aug 25 22:41:44 2005 +0000 @@ -16,11 +16,24 @@ """ resource_dir = os.path.join(os.path.split(__file__)[0], "calendars") - urlencoding = "utf-8" + encoding = "utf-8" - def __init__(self): + def __init__(self, fsencoding=None): if not os.path.exists(self.resource_dir): os.mkdir(self.resource_dir) + self.fsencoding = fsencoding + + def _convert_name(self, name): + if self.fsencoding: + return name.encode(self.fsencoding) + else: + return name + + def _convert_fsname(self, name): + if self.fsencoding: + return unicode(name, self.fsencoding) + else: + return name def respond(self, trans): @@ -29,10 +42,6 @@ one. """ - # Remember uploaded calendars using a session. - - session = trans.get_session(create=1) - # Determine the action to be taken. method = trans.get_request_method() @@ -40,8 +49,7 @@ # NOTE: Some frameworks do not pass in the content type. # NOTE: We always assume that calendar files are being uploaded. - content_type = trans.get_content_type() - calendar_name = trans.get_virtual_path_info(self.urlencoding).split("/")[-1] + calendar_name = trans.get_virtual_path_info(self.encoding).split("/")[-1] # Handle uploads. @@ -55,7 +63,7 @@ # Store the calendar in the directory. - f = open(os.path.join(self.resource_dir, calendar_name), "wb") + f = open(self._convert_name(os.path.join(self.resource_dir, calendar_name)), "wb") f.write(data) f.close() @@ -63,13 +71,13 @@ elif method == "PROPFIND": trans.set_response_code(207) - trans.set_content_type(WebStack.Generic.ContentType("text/html")) + trans.set_content_type(WebStack.Generic.ContentType("text/xml", self.encoding)) out = trans.get_response_stream() out.write(""" """) - if trans.get_virtual_path_info(self.urlencoding) == "/": + if trans.get_virtual_path_info(self.encoding) == "/": time_now = time.strftime("%Y-%m-%dT%TZ", time.gmtime(time.time())) out.write(""" @@ -85,7 +93,10 @@ HTTP/1.1 200 OK -""" % (trans.get_path_without_query(self.urlencoding), time_now, trans.get_path_without_query(self.urlencoding))) +""" % ( + trans.get_path_without_query(self.encoding), + time_now, + trans.get_path_without_query(self.encoding))) for filename in os.listdir(self.resource_dir): pathname = os.path.join(self.resource_dir, filename) @@ -105,7 +116,13 @@ HTTP/1.1 200 OK -""" % (trans.get_path_without_query(self.urlencoding), filename, created, filename, "text/calendar", size)) +""" % ( + trans.get_path_without_query(self.encoding), + self._convert_fsname(filename), + created, + self._convert_fsname(filename), + "text/calendar", + size)) out.write(""" @@ -114,9 +131,9 @@ # Handle downloads. elif method == "GET": - trans.set_content_type(WebStack.Generic.ContentType("text/html")) + trans.set_content_type(WebStack.Generic.ContentType("text/calendar")) out = trans.get_response_stream() - f = open(os.path.join(self.resource_dir, calendar_name)) + f = open(self._convert_name(os.path.join(self.resource_dir, calendar_name))) out.write(f.read()) f.close() @@ -140,12 +157,16 @@ # NOTE: Assume that the URL references the same "directory". destination = destinations[0].split("/")[-1] + destination = trans.decode_path(destination, self.encoding) if method == "MOVE": - os.rename(os.path.join(self.resource_dir, calendar_name), os.path.join(self.resource_dir, destination)) + os.rename( + self._convert_name(os.path.join(self.resource_dir, calendar_name)), + self._convert_name(os.path.join(self.resource_dir, destination)) + ) elif method == "COPY": - f_old = open(os.path.join(self.resource_dir, calendar_name), "rb") - f_new = open(os.path.join(self.resource_dir, destination), "wb") + f_old = open(self._convert_name(os.path.join(self.resource_dir, calendar_name)), "rb") + f_new = open(self._convert_name(os.path.join(self.resource_dir, destination)), "wb") f_new.write(f_old.read()) f_new.close() f_old.close()