Package phones :: Module com_sanyomedia
[hide private]
[frames] | no frames]

Source Code for Module phones.com_sanyomedia

  1  ### BITPIM 
  2  ### 
  3  ### Copyright (C) 2004, 2005 Stephen Wood <sawecw@users.sf.net> 
  4  ### 
  5  ### This program is free software; you can redistribute it and/or modify 
  6  ### it under the terms of the BitPim license as detailed in the LICENSE file. 
  7  ### 
  8  ### $Id: com_sanyomedia.py 3707 2006-11-29 04:49:48Z sawecw $ 
  9   
 10  """Common code for Sanyo Media transfers""" 
 11   
 12  # standard modules 
 13   
 14  import time 
 15  import cStringIO 
 16  import re 
 17   
 18  # BitPim Modules 
 19  import com_sanyo 
 20  import com_brew 
 21  import com_phone 
 22  import p_sanyomedia 
 23  import prototypes 
 24   
25 -class SanyoMedia:
26 "Download and upload media (ringers/wallpaper) from Sanyo Phones" 27 28 FIRST_MEDIA_DIRECTORY=2 29 LAST_MEDIA_DIRECTORY=3 30 CAMERA_DIRECTORY=1 31 32 # Directories: 33 # 1: Camera Pictures and Videos. MDM - Video 34 # V - Picture 35 # 2: Downloads 36 # 3: Cable uploads 37 # 4: Duplicate of directory 1 ?? 38 39 imagelocations=( 40 # offset, directory #, indexflag, type, maximumentries 41 ( 300, 1, 1, "images", 30), 42 ( 300, 1, 0, "camera", 30), 43 ) 44 45 wallpaperexts=(".jpg", ".png", ".mp4", ".3g2",".JPG") 46 ringerexts=(".mid", ".qcp", ".mp3", ".m4a", ".pmd", ".bin") 47
48 - def __init__(self):
49 pass
50
51 - def getmediaindices(self, results):
52 com_sanyo.SanyoPhonebook.getmediaindices(self, results) 53 ringermedia=results['ringtone-index'] 54 imagemedia=results['wallpaper-index'] 55 56 copypat=re.compile(r"(.*)\.(\d+)$") 57 for idir in range(self.FIRST_MEDIA_DIRECTORY, self.LAST_MEDIA_DIRECTORY+1): 58 self.log("Indexing directory "+`idir`) 59 req=self.protocolclass.sanyochangedir() 60 req.dirindex=idir 61 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 62 req=self.protocolclass.sanyonumfilesrequest() 63 try: 64 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 65 except com_sanyo.SanyoCommandException, ex: 66 if ex.errnum!=121: 67 raise 68 self.log("Skipping directory "+`idir`) 69 continue 70 71 self.log("Directory "+`idir`+", File Count="+`res.count`) 72 nfiles=res.count 73 for ifile in range(nfiles): 74 req=self.protocolclass.sanyomediafilenamerequest() 75 req.index=ifile 76 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 77 name=res.filename 78 orgname=name 79 80 unique=False 81 while not unique: 82 unique=True 83 for idx in imagemedia.keys(): 84 if name==imagemedia[idx]['name']: 85 matchresult=copypat.match(name) 86 if matchresult: 87 copycount=int(matchresult.group(2))+1 88 name=matchresult.group(1)+"."+str(copycount) 89 else: 90 name=name+".1" 91 # Keep looping until sure we have unique name 92 unique=False 93 break 94 if idir==self.CAMERA_DIRECTORY: 95 96 if res.num3==0: # Original Camera Picture 97 # Could convert filename to to a date 98 imagemedia[ifile+1000*idir]={'name': name, 'origin': "camera"} 99 else: 100 # Wallet pictures 101 imagemedia[res.num3]={'name': name, 'origin': "images"} 102 else: 103 idx=ifile+1000*idir 104 105 # Make this more elegant later 106 iswallpaper=0 107 for ext in self.wallpaperexts: 108 if orgname.endswith(ext): 109 imagemedia[idx]={'name': name, 'origin': "images"} 110 iswallpaper=1 111 break 112 if not iswallpaper: 113 for ext in self.ringerexts: 114 if orgname.endswith(ext): 115 ringermedia[idx]={'name': name, 'origin': "ringers"} 116 break 117 118 results['ringtone-index']=ringermedia 119 results['wallpaper-index']=imagemedia 120 return
121 122
123 - def getmediaindex(self, builtins, maps, results, key):
124 media=com_sanyo.SanyoPhonebook.getmediaindex(self, builtins, maps, results, key) 125 # the maps 126 type='' 127 for offset,indexfile,indextype,type,maxentries in maps: 128 req=self.protocolclass.sanyochangedir() 129 req.dirindex=indexfile 130 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 131 req=self.protocolclass.sanyonumfilesrequest() 132 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 133 for ifile in range(res.count): 134 req=self.protocolclass.sanyomediafilenamerequest() 135 req.index=ifile 136 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 137 media[ifile+offset]={'name': res.filename, 'origin': "camera"} 138 139 results[key]=media 140 return media
141
142 - def getindex(self, location):
143 "Get an index of files in a Sanyo directory" 144 index={} 145 req=self.protocolclass.sanyochangedir() 146 req.dirindex=location 147 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 148 149 req=self.protocolclass.sanyonumfilesrequest() 150 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 151 for ifile in range(res.count): 152 req=self.protocolclass.sanyomediafilenamerequest() 153 req.index=ifile 154 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 155 index[ifile]=res.filename 156 157 return index
158
159 - def getmedia(self, exts, result, key):
160 media={} 161 # Essentially duplicating code in getmediaindices 162 copypat=re.compile(r"(.*)\.(\d+)$") 163 if key=="wallpapers": 164 mediaindex=result['wallpaper-index'] 165 else: 166 mediaindex=result['ringtone-index'] 167 168 for idir in range(self.FIRST_MEDIA_DIRECTORY, self.LAST_MEDIA_DIRECTORY+1): 169 self.log("Reading "+key+" from directory "+`idir`) 170 req=self.protocolclass.sanyochangedir() 171 req.dirindex=idir 172 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 173 req=self.protocolclass.sanyonumfilesrequest() 174 try: 175 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 176 except com_sanyo.SanyoCommandException, ex: 177 if ex.errnum!=121: 178 raise 179 self.log("Skipping directory "+`idir`) 180 continue 181 182 self.log("Directory "+`idir`+", File Count="+`res.count`) 183 nfiles=res.count 184 for ifile in range(nfiles): 185 req=self.protocolclass.sanyomediafilenamerequest() 186 req.index=ifile 187 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 188 # self.log(res.filename+": "+`res.num1`+" "+`res.num2`+" "+`res.num3`+" "+`res.num4`) 189 190 orgname=res.filename 191 if idir==self.CAMERA_DIRECTORY and res.num3!=0: 192 idx=res.num3 193 else: 194 idx=ifile+1000*idir 195 196 # Get the file if it has the right extension 197 for ext in exts: 198 if orgname.endswith(ext): 199 filename=mediaindex[idx]['name'] 200 self.log("Retrieving file: "+orgname+", saving as "+filename) 201 try: 202 media[filename]=self.getsanyofilecontents(idir,ifile) 203 except (com_brew.BrewNoSuchFileException,com_brew.BrewBadPathnameException): 204 self.log("It was in the index, but not on the filesystem") 205 break 206 207 result[key]=media 208 return result
209 210 211
212 - def getmediaold(self, maps, result, key):
213 media={} 214 for offset,indexfile,indextype,type,maxentries in maps: 215 index=self.getindex(indexfile) 216 for i in index: 217 try: 218 media[index[i]]=self.getsanyofilecontents(indexfile,i) 219 except (com_brew.BrewNoSuchFileException,com_brew.BrewBadPathnameException): 220 self.log("It was in the index, but not on the filesystem") 221 222 result[key]=media 223 return result
224
225 - def getwallpapers(self, result):
226 return self.getmedia(self.wallpaperexts, result, 'wallpapers')
227
228 - def getringtones(self, result):
229 return self.getmedia(self.ringerexts, result, 'ringtone')
230 231
232 - def getsanyofilecontents(self, directory, fileindex):
233 "Get file # index from directory # directory" 234 start=time.time() 235 self.log("Getting file # "+`fileindex`+" from directory "+`directory`) 236 desc="Reading "+`directory`+"/"+`fileindex` 237 238 req=self.protocolclass.sanyochangedir() 239 req.dirindex=directory 240 241 res=self.sendpbcommand(req, self.protocolclass.sanyochangedirresponse) 242 243 req=self.protocolclass.sanyonumfilesrequest() 244 res=self.sendpbcommand(req, self.protocolclass.sanyonumfilesresponse) 245 246 # Should check that fileindex requested does not exceed number 247 # of files in directory 248 249 req=self.protocolclass.sanyomediafilenamerequest() 250 req.index=fileindex 251 res=self.sendpbcommand(req, self.protocolclass.sanyomediafilenameresponse) 252 253 req=self.protocolclass.sanyomediafragmentrequest() 254 req.fileindex=fileindex 255 256 # Can't find a way to get the file size so we can show progress 257 258 data=cStringIO.StringIO() 259 260 more=1 261 counter=0 262 filesize=0 263 while more==1: 264 counter+=1 265 if counter%5==0: 266 self.progress(counter%250, 250, desc) 267 268 res=self.sendpbcommand(req,self.protocolclass.sanyomediafragmentresponse) 269 data.write(res.data[0:res.length]) 270 more=res.more 271 filesize+=res.length 272 273 self.progress(1,1,desc) 274 275 data=data.getvalue() 276 end=time.time() 277 if end-start>3: 278 self.log("Read "+`filesize`+" bytes at "+`int(filesize/(end-start))`+" bytes/second") 279 280 return data
281