class Server(Thread):
    def __init__(self, sockAddress):
        Thread.__init__(self)
        self.sock, self.address = sockAddress
        self.fsock = EncapFramedSock(sockAddress)

    def run(self):
        print("new thread handling connection from", self.address)
        while True:
            try:
                fileName, contents = self.fsock.receive(debug)
            except:
                print("Error: File transfer was not successful!")
                self.fsock.sendStatus(0, debug)
                self.fsock.close()
                sys.exit(1)

            if debug:
                print("Received", contents)

            # Data not received. Exit system.
            if fileName is None or contents is None:
                print("Client ", self.address, " has disconnected")
                sys.exit(0)

            lock.acquire()
            if debug:
                time.sleep(5)

            fileName = fileName.decode()
            self.writeFile(fileName, contents)

            self.fsock.sendStatus(1, debug)
            lock.release()

    def writeFile(self, fileName, contents):
        if fileName is None:
            raise TypeError
        if contents is None:
            raise TypeError
        try:
            # Check if there is a directory to receive files.
            if not os.path.exists(PATH):
                os.makedirs(PATH)
            os.chdir(PATH)

            # New file to open.
            writer = open(fileName, 'w+b')
            writer.write(contents)
            writer.close()
            print("File %s received from %s" % (fileName, self.address)
                  )  # Prints output to ensure the file was received.
        except FileNotFoundError:
            print("File Not Found Error: File %s not found" %
                  fileName)  # File not found error. Exit.
            self.fsock.Status(0, debug)
            sys.exit(1)
class Server(Thread):
    
    def __init__(self, sockAddress):
        Thread.__init__(self)
        self.sock, self.address = sockAddress
        self.fsock = EncapFramedSock(sockAddress)

    def run(self):
        print("new thread handling connection from", self.address)
        while 1:
            try:
                print("try statement 1 ********")
                fileName, contents = self.fsock.receive()
                print("done **********")
            except:
                print("Error: File transfer was not successful!")
                self.fsock.sendStatus(0)
                self.fsock.close()
                sys.exit(1)

            # data not received
            if fileName is None or contents is None:
                print ("Client ", self.address, " has disconnected")
                sys.exit(0)
            print("writing *********")
            lock.acquire()

            # write the file
            fileName = fileName.decode()
            self.writeFile(fileName, contents)

            self.fsock.sendStatus(1)
            lock.release()
            print("release *********")
            
    def writeFile(self, fileName, contents):

        if fileName is None:
            raise TypeError
        if contents is None:
            raise TypeError

        try:
            # check if dir exists to receive files
            if not os.path.exists(PATH):
                os.makedirs(PATH)
            os.chdir(PATH)

            # create file to write
            writer = open(fileName, 'w+b')
            writer.write(contents)
            writer.close()
            print("File %s received from %s" % (fileName, self.address))
        except FileNotFoundError:
            print("File Not Found Error: File %s not found" % fileName)
            self.fsock.Status(0)
            sys.exit(1)