def synchronize( self, with_reload = False ): # change current directory to Python home cwd = os.getcwd() if os.path.exists( 'c:/system/apps/python/python.app' ): os.chdir( 'c:/system/apps/python' ) elif os.path.exists( 'e:/system/apps/python/python.app' ): os.chdir( 'e:/system/apps/python' ) # ask for file names, checksums try: pc_offering = eval(self.server.recv_data()) except 'Timeout': print >> self.server.orig_stdout, 'BT connection timed out.' print >> self.server.orig_stdout, 'Are you sure sync demon is running on PC?' return pc_demand = eval(self.server.recv_data()) # check whether some of the files should be retrieved for ph_file, pc_file, checksum in pc_offering: if checksum != phcomm.file_checksum( ph_file ): # checksums differ, get the file self.server.send( 'getfile', pc_file ) # create / overwrite the file dirpath = os.path.split( ph_file )[0] if not os.path.exists( dirpath ): os.makedirs( dirpath ) self.server.recv_file( ph_file ) print >> self.server.orig_stdout, 'received', ph_file if with_reload: # reload a module if it appears in sys.modules modpath, ext = os.path.splitext( ph_file ) modname = os.path.split(modpath)[1].lower() if modname in sys.modules.keys(): reload( sys.modules[modname] ) print >> self.server.orig_stdout, 'reloaded module: ', modname # check which files the pc wants, whether some should be sent for targetdir, phone_patterns in pc_demand: # force patterns to be a sequence if not isinstance(phone_patterns, tuple) and not isinstance(phone_patterns, list): phone_patterns = [ phone_patterns ] for patt in phone_patterns: for fname in glob.glob( patt ): try: # read in the data f = open( fname, 'rb' ) data = f.read() f.close() # calculate checksum crc = phcomm.data_checksum( data ) # offer the file (with checksum and target filename) print >> self.server.orig_stdout, 'offering', fname self.server.send( 'offerfile %d' % crc, os.path.join(targetdir, os.path.split(fname)[1]) ) # does the pc want the file? if int(self.server.readline()): # yes, the pc wants this file self.server.send_data( data ) print >> self.server.orig_stdout, ' SENT.' else: # no, skip this file print >> self.server.orig_stdout, ' NOT sent.' del data # help in memory cleanup except: pass print >> self.server.orig_stdout, 'sync done' print 'sync done.' # restore cwd os.chdir( cwd )
def synchronize( self, reload=False ): # read in the config file # it should create variables COM_PORT and SYNC_FILES #print 'config file', self.owner.sync_config_file #execfile( self.owner.sync_config_file, {}, d ) execfile( 'sync.config', globals(), globals() ) # chdir to the directory of the config_file (if not already there) # so relative paths work cwd = os.getcwd() try: os.chdir( os.path.split( config_file )[0] ) except: pass #print 'before sync' if reload: self.bt.send( 'syncl' ) else: self.bt.send( 'sync' ) #print 'after sync' # create lists of local and corresponding remote files and checksums remotefiles, localfiles, checksums = [], [], [] for dest, srcs in SYNC_FROM_PC: # for each destination directory there can be several # source directories dpath = os.path.normpath( dest ) if not isinstance(srcs, tuple) and not isinstance(srcs, list): # force sources to be a list srcs = [ srcs ] for src in srcs: # for each source location for f in glob.glob( src ): # find matching files file = os.path.split(f)[1] # create remote name, local name, checksum remotefiles.append( os.path.join( dpath, file ) ) localfiles.append( os.path.normpath( f ) ) checksums.append( phcomm.file_checksum( f ) ) #print 'send upload files', repr(zip(remotefiles, localfiles, checksums)) # send to phone a list of remote, local, checksum triplets self.bt.send_data( repr(zip(remotefiles, localfiles, checksums)) ) #print 'send SYNC_TO_PC', repr( SYNC_TO_PC ) # then send the info about the files that you want to download to pc self.bt.send_data( repr( SYNC_TO_PC ) ) #print 'after download files' # now the phone loops over the files that it wants to get line = self.bt.readline() while line.split()[0] == 'getfile': filename = self.bt.recv_data() print filename data = open( filename, 'rb' ).read() print 'read data' self.bt.send_data( data ) print 'sent it' print >> self.stdout, 'sent file: ' + filename line = self.bt.readline() # now the phone loops over the files that it wants to send while line.split()[0] == 'offerfile': crc = int( line.split()[1] ) filename = self.bt.recv_data() pc_crc = phcomm.file_checksum( filename ) if crc == pc_crc: # don't need this file self.bt.send( '0' ) else: # yes, want this file self.bt.send( '1' ) # create directory if needed dirpath = os.path.split( filename )[0] if not os.path.exists( dirpath ): os.makedirs( dirpath ) # read and write the file print >> self.stdout, 'getting file: ' + filename print 'getting file: ' + filename wx.YieldIfNeeded() #open( filename, 'wb' ).write( self.bt.recv_data() ) self.bt.recv_file( filename ) print >> self.stdout, 'received file: ' + filename print 'received file: ' + filename wx.YieldIfNeeded() line = self.bt.readline() # done, the last message is a printout that we indeed are done assert line.split()[0] == 'output' output = self.bt.recv_data().rstrip() print >> self.stdout, output print 'done' # restore cwd os.chdir( cwd )