0001 ### BITPIM 0002 ### 0003 ### Copyright (C) 2004, 2005 Stephen Wood <sawecw@users.sf.net> 0004 ### 0005 ### This program is free software; you can redistribute it and/or modify 0006 ### it under the terms of the BitPim license as detailed in the LICENSE file. 0007 ### 0008 ### $Id: com_sanyomedia.py 3707 2006-11-29 04:49:48Z sawecw $ 0009 0010 """Common code for Sanyo Media transfers""" 0011 0012 # standard modules 0013 0014 import time 0015 import cStringIO 0016 import re 0017 0018 # BitPim Modules 0019 import com_sanyo 0020 import com_brew 0021 import com_phone 0022 import p_sanyomedia 0023 import prototypes 0024 0025 class SanyoMedia: 0026 "Download and upload media (ringers/wallpaper) from Sanyo Phones" 0027 0028 FIRST_MEDIA_DIRECTORY=2 0029 LAST_MEDIA_DIRECTORY=3 0030 CAMERA_DIRECTORY=1 0031 0032 # Directories: 0033 # 1: Camera Pictures and Videos. MDM - Video 0034 # V - Picture 0035 # 2: Downloads 0036 # 3: Cable uploads 0037 # 4: Duplicate of directory 1 ?? 0038 0039 imagelocations=( 0040 # offset, directory #, indexflag, type, maximumentries 0041 ( 300, 1, 1, "images", 30), 0042 ( 300, 1, 0, "camera", 30), 0043 ) 0044 0045 wallpaperexts=(".jpg", ".png", ".mp4", ".3g2",".JPG") 0046 ringerexts=(".mid", ".qcp", ".mp3", ".m4a", ".pmd", ".bin") 0047 0048 def __init__(self): 0049 pass 0050 0051 def getmediaindices(self, results): 0052 com_sanyo.SanyoPhonebook.getmediaindices(self, results) 0053 ringermedia=results['ringtone-index'] 0054 imagemedia=results['wallpaper-index'] 0055 0056 copypat=re.compile(r"(.*)\.(\d+)$") 0057 for idir in range(self.FIRST_MEDIA_DIRECTORY, self.LAST_MEDIA_DIRECTORY+1): 0058 self.log("Indexing directory "+`idir`) 0059 req=self.protocolclass.sanyochangedir() 0060 req.dirindex=idir 0061 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 0062 req=self.protocolclass.sanyonumfilesrequest() 0063 try: 0064 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 0065 except com_sanyo.SanyoCommandException, ex: 0066 if ex.errnum!=121: 0067 raise 0068 self.log("Skipping directory "+`idir`) 0069 continue 0070 0071 self.log("Directory "+`idir`+", File Count="+`res.count`) 0072 nfiles=res.count 0073 for ifile in range(nfiles): 0074 req=self.protocolclass.sanyomediafilenamerequest() 0075 req.index=ifile 0076 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 0077 name=res.filename 0078 orgname=name 0079 0080 unique=False 0081 while not unique: 0082 unique=True 0083 for idx in imagemedia.keys(): 0084 if name==imagemedia[idx]['name']: 0085 matchresult=copypat.match(name) 0086 if matchresult: 0087 copycount=int(matchresult.group(2))+1 0088 name=matchresult.group(1)+"."+str(copycount) 0089 else: 0090 name=name+".1" 0091 # Keep looping until sure we have unique name 0092 unique=False 0093 break 0094 if idir==self.CAMERA_DIRECTORY: 0095 0096 if res.num3==0: # Original Camera Picture 0097 # Could convert filename to to a date 0098 imagemedia[ifile+1000*idir]={'name': name, 'origin': "camera"} 0099 else: 0100 # Wallet pictures 0101 imagemedia[res.num3]={'name': name, 'origin': "images"} 0102 else: 0103 idx=ifile+1000*idir 0104 0105 # Make this more elegant later 0106 iswallpaper=0 0107 for ext in self.wallpaperexts: 0108 if orgname.endswith(ext): 0109 imagemedia[idx]={'name': name, 'origin': "images"} 0110 iswallpaper=1 0111 break 0112 if not iswallpaper: 0113 for ext in self.ringerexts: 0114 if orgname.endswith(ext): 0115 ringermedia[idx]={'name': name, 'origin': "ringers"} 0116 break 0117 0118 results['ringtone-index']=ringermedia 0119 results['wallpaper-index']=imagemedia 0120 return 0121 0122 0123 def getmediaindex(self, builtins, maps, results, key): 0124 media=com_sanyo.SanyoPhonebook.getmediaindex(self, builtins, maps, results, key) 0125 # the maps 0126 type='' 0127 for offset,indexfile,indextype,type,maxentries in maps: 0128 req=self.protocolclass.sanyochangedir() 0129 req.dirindex=indexfile 0130 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 0131 req=self.protocolclass.sanyonumfilesrequest() 0132 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 0133 for ifile in range(res.count): 0134 req=self.protocolclass.sanyomediafilenamerequest() 0135 req.index=ifile 0136 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 0137 media[ifile+offset]={'name': res.filename, 'origin': "camera"} 0138 0139 results[key]=media 0140 return media 0141 0142 def getindex(self, location): 0143 "Get an index of files in a Sanyo directory" 0144 index={} 0145 req=self.protocolclass.sanyochangedir() 0146 req.dirindex=location 0147 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 0148 0149 req=self.protocolclass.sanyonumfilesrequest() 0150 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 0151 for ifile in range(res.count): 0152 req=self.protocolclass.sanyomediafilenamerequest() 0153 req.index=ifile 0154 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 0155 index[ifile]=res.filename 0156 0157 return index 0158 0159 def getmedia(self, exts, result, key): 0160 media={} 0161 # Essentially duplicating code in getmediaindices 0162 copypat=re.compile(r"(.*)\.(\d+)$") 0163 if key=="wallpapers": 0164 mediaindex=result['wallpaper-index'] 0165 else: 0166 mediaindex=result['ringtone-index'] 0167 0168 for idir in range(self.FIRST_MEDIA_DIRECTORY, self.LAST_MEDIA_DIRECTORY+1): 0169 self.log("Reading "+key+" from directory "+`idir`) 0170 req=self.protocolclass.sanyochangedir() 0171 req.dirindex=idir 0172 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 0173 req=self.protocolclass.sanyonumfilesrequest() 0174 try: 0175 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 0176 except com_sanyo.SanyoCommandException, ex: 0177 if ex.errnum!=121: 0178 raise 0179 self.log("Skipping directory "+`idir`) 0180 continue 0181 0182 self.log("Directory "+`idir`+", File Count="+`res.count`) 0183 nfiles=res.count 0184 for ifile in range(nfiles): 0185 req=self.protocolclass.sanyomediafilenamerequest() 0186 req.index=ifile 0187 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 0188 # self.log(res.filename+": "+`res.num1`+" "+`res.num2`+" "+`res.num3`+" "+`res.num4`) 0189 0190 orgname=res.filename 0191 if idir==self.CAMERA_DIRECTORY and res.num3!=0: 0192 idx=res.num3 0193 else: 0194 idx=ifile+1000*idir 0195 0196 # Get the file if it has the right extension 0197 for ext in exts: 0198 if orgname.endswith(ext): 0199 filename=mediaindex[idx]['name'] 0200 self.log("Retrieving file: "+orgname+", saving as "+filename) 0201 try: 0202 media[filename]=self.getsanyofilecontents(idir,ifile) 0203 except (com_brew.BrewNoSuchFileException,com_brew.BrewBadPathnameException): 0204 self.log("It was in the index, but not on the filesystem") 0205 break 0206 0207 result[key]=media 0208 return result 0209 0210 0211 0212 def getmediaold(self, maps, result, key): 0213 media={} 0214 for offset,indexfile,indextype,type,maxentries in maps: 0215 index=self.getindex(indexfile) 0216 for i in index: 0217 try: 0218 media[index[i]]=self.getsanyofilecontents(indexfile,i) 0219 except (com_brew.BrewNoSuchFileException,com_brew.BrewBadPathnameException): 0220 self.log("It was in the index, but not on the filesystem") 0221 0222 result[key]=media 0223 return result 0224 0225 def getwallpapers(self, result): 0226 return self.getmedia(self.wallpaperexts, result, 'wallpapers') 0227 0228 def getringtones(self, result): 0229 return self.getmedia(self.ringerexts, result, 'ringtone') 0230 0231 0232 def getsanyofilecontents(self, directory, fileindex): 0233 "Get file # index from directory # directory" 0234 start=time.time() 0235 self.log("Getting file # "+`fileindex`+" from directory "+`directory`) 0236 desc="Reading "+`directory`+"/"+`fileindex` 0237 0238 req=self.protocolclass.sanyochangedir() 0239 req.dirindex=directory 0240 0241 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 0242 0243 req=self.protocolclass.sanyonumfilesrequest() 0244 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 0245 0246 # Should check that fileindex requested does not exceed number 0247 # of files in directory 0248 0249 req=self.protocolclass.sanyomediafilenamerequest() 0250 req.index=fileindex 0251 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 0252 0253 req=self.protocolclass.sanyomediafragmentrequest() 0254 req.fileindex=fileindex 0255 0256 # Can't find a way to get the file size so we can show progress 0257 0258 data=cStringIO.StringIO() 0259 0260 more=1 0261 counter=0 0262 filesize=0 0263 while more==1: 0264 counter+=1 0265 if counter%5==0: 0266 self.progress(counter%250, 250, desc) 0267 0268 res=self.sendpbcommand(req,self.protocolclass.sanyomediafragmentresponse) 0269 data.write(res.data[0:res.length]) 0270 more=res.more 0271 filesize+=res.length 0272 0273 self.progress(1,1,desc) 0274 0275 data=data.getvalue() 0276 end=time.time() 0277 if end-start>3: 0278 self.log("Read "+`filesize`+" bytes at "+`int(filesize/(end-start))`+" bytes/second") 0279 0280 return data 0281 0282
Generated by PyXR 0.9.4