rubymtp 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +340 -0
- data/ChangeLog +2 -0
- data/README +57 -0
- data/bin/mtpfs +10 -0
- data/bin/podcast +10 -0
- data/lib/mtp.rb +285 -0
- data/lib/mtp/association.rb +49 -0
- data/lib/mtp/container.rb +121 -0
- data/lib/mtp/datacode.rb +485 -0
- data/lib/mtp/datatypes.rb +51 -0
- data/lib/mtp/device.rb +270 -0
- data/lib/mtp/fuse.rb +368 -0
- data/lib/mtp/object.rb +122 -0
- data/lib/mtp/playlist.rb +60 -0
- data/lib/mtp/podcast.rb +162 -0
- data/lib/mtp/properties.rb +226 -0
- data/lib/mtp/protocol.rb +298 -0
- data/lib/mtp/storage.rb +39 -0
- data/lib/mtp/track.rb +74 -0
- data/patches/ruby-mp3info-0.5.diff +80 -0
- data/patches/syndication-0.6.1.diff +41 -0
- data/test/container_test.rb +13 -0
- metadata +87 -0
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            module MTP
         | 
| 2 | 
            +
              class Association
         | 
| 3 | 
            +
                ASSOCIATION_CODES = {
         | 
| 4 | 
            +
                  0x0000 => "Undefined", 0x0001 => "Generic Folder", 0x0002 => "Album", 0x0003 => "Time Sequence",
         | 
| 5 | 
            +
                  0x0004 => "Horizontal Panoramic", 0x0005 => "Vertical Panoramic", 0x0006 => "2D Panoramic",
         | 
| 6 | 
            +
                  0x0007 => "Ancillary Data"
         | 
| 7 | 
            +
                }
         | 
| 8 | 
            +
                
         | 
| 9 | 
            +
                def self.load(code, desc)
         | 
| 10 | 
            +
                  assoc = case code
         | 
| 11 | 
            +
                          when 0x0001
         | 
| 12 | 
            +
                            GenericFolder.load(desc)
         | 
| 13 | 
            +
                          else
         | 
| 14 | 
            +
                            Association.new
         | 
| 15 | 
            +
                          end
         | 
| 16 | 
            +
                  assoc.instance_eval do
         | 
| 17 | 
            +
                    self.code = code
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                  assoc
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
                
         | 
| 22 | 
            +
                attr_reader :code
         | 
| 23 | 
            +
                def code=(code)
         | 
| 24 | 
            +
                  @code = (code.is_a?(Datacode) ? code : Datacode.new(code, ASSOCIATION_CODES))
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                def desc
         | 
| 28 | 
            +
                  0x0000
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
                  
         | 
| 31 | 
            +
                class GenericFolder < Association
         | 
| 32 | 
            +
                  def self.load(desc)
         | 
| 33 | 
            +
                    assoc = GenericFolder.new
         | 
| 34 | 
            +
                    assoc.instance_eval do
         | 
| 35 | 
            +
                      @bidirectional = !desc.zero?
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
                    assoc
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                  
         | 
| 40 | 
            +
                  def bidirectional?
         | 
| 41 | 
            +
                    @bidirectional
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                  
         | 
| 44 | 
            +
                  def desc
         | 
| 45 | 
            +
                    (!@birirectional).to_i
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
            end
         | 
| @@ -0,0 +1,121 @@ | |
| 1 | 
            +
            module MTP
         | 
| 2 | 
            +
              class Container
         | 
| 3 | 
            +
                attr_accessor :length_read
         | 
| 4 | 
            +
                def self.parse(str)
         | 
| 5 | 
            +
                  length, type, code, transaction_id, payload = str.unpack_without_mtp("ISSIa*")
         | 
| 6 | 
            +
                  container = case type
         | 
| 7 | 
            +
                              when 1
         | 
| 8 | 
            +
                                Request.new
         | 
| 9 | 
            +
                              when 2 
         | 
| 10 | 
            +
                                Data.new
         | 
| 11 | 
            +
                              when 3
         | 
| 12 | 
            +
                                Response.new
         | 
| 13 | 
            +
                              when 4
         | 
| 14 | 
            +
                                Event.new
         | 
| 15 | 
            +
                              else
         | 
| 16 | 
            +
                                raise MTPError.new("unable to parse packet: #{str.inspect}")
         | 
| 17 | 
            +
                              end
         | 
| 18 | 
            +
                  container.length, container.code, container.transaction_id, container.payload = 
         | 
| 19 | 
            +
                    length, code, transaction_id, payload
         | 
| 20 | 
            +
                  container
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              
         | 
| 23 | 
            +
                attr_accessor :code, :transaction_id, :length, :payload
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def code=(code)
         | 
| 26 | 
            +
                  @code = (code.is_a?(Datacode) ? code : Datacode.new(code))
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
                  
         | 
| 29 | 
            +
                def type
         | 
| 30 | 
            +
                  0
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                
         | 
| 33 | 
            +
                def pack
         | 
| 34 | 
            +
                  blob = [ type, code, transaction_id ].pack_without_mtp("SSI") + pack_payload
         | 
| 35 | 
            +
                  return [ blob.length + 4 ].pack_without_mtp("I") + blob
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def pack_header
         | 
| 39 | 
            +
                  blob = [ type, code, transaction_id ].pack_without_mtp("SSI") + pack_payload
         | 
| 40 | 
            +
                  return [ blob.length + 4, type, code, transaction_id ].pack_without_mtp("ISSI") 
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
                
         | 
| 43 | 
            +
                def pack_payload
         | 
| 44 | 
            +
                  @payload
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
                
         | 
| 47 | 
            +
                def to_s
         | 
| 48 | 
            +
                  "#{self.class} @code=#{code.inspect}, @transaction_id=#{transaction_id}"
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
              
         | 
| 52 | 
            +
              class ParametersContainer < Container
         | 
| 53 | 
            +
                attr_accessor :parameters
         | 
| 54 | 
            +
                def initialize
         | 
| 55 | 
            +
                  super
         | 
| 56 | 
            +
                  @parameters = []
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
                
         | 
| 59 | 
            +
                def pack_payload
         | 
| 60 | 
            +
                  @parameters.pack_without_mtp("I*") 
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
                
         | 
| 63 | 
            +
                def payload=(payload)
         | 
| 64 | 
            +
                  @payload = payload
         | 
| 65 | 
            +
                  @parameters = payload.unpack("I*")
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
              end     
         | 
| 68 | 
            +
              
         | 
| 69 | 
            +
              class Request < ParametersContainer
         | 
| 70 | 
            +
                def self.for(code, *parameters)
         | 
| 71 | 
            +
                  request = Request.new
         | 
| 72 | 
            +
                  request.code = code
         | 
| 73 | 
            +
                  request.parameters = parameters
         | 
| 74 | 
            +
                  request
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
                
         | 
| 77 | 
            +
                def type
         | 
| 78 | 
            +
                  1
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
              
         | 
| 82 | 
            +
              class Data < Container
         | 
| 83 | 
            +
                attr_accessor :size
         | 
| 84 | 
            +
                
         | 
| 85 | 
            +
                def initialize(payload = nil, size = nil)
         | 
| 86 | 
            +
                  @payload = payload
         | 
| 87 | 
            +
                  @size = size
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
                  
         | 
| 90 | 
            +
                def type 
         | 
| 91 | 
            +
                  2
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
                
         | 
| 94 | 
            +
                def pack_header
         | 
| 95 | 
            +
                  if size.nil?
         | 
| 96 | 
            +
                    blob = [ type, code, transaction_id ].pack_without_mtp("SSI") + pack_payload
         | 
| 97 | 
            +
                    return [ blob.length + 4, type, code, transaction_id ].pack_without_mtp("ISSI") 
         | 
| 98 | 
            +
                  else
         | 
| 99 | 
            +
                    blob = [ 12  + size, type, code, transaction_id ].pack_without_mtp("ISSI")
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
              end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
              class Response < ParametersContainer
         | 
| 106 | 
            +
                attr_accessor :data
         | 
| 107 | 
            +
                def one_of?(*names)
         | 
| 108 | 
            +
                  names.include?(code.name)
         | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
                
         | 
| 111 | 
            +
                def type
         | 
| 112 | 
            +
                  3
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
              end
         | 
| 115 | 
            +
                
         | 
| 116 | 
            +
              class Event < Container
         | 
| 117 | 
            +
                def type
         | 
| 118 | 
            +
                    4
         | 
| 119 | 
            +
                end
         | 
| 120 | 
            +
              end
         | 
| 121 | 
            +
            end
         | 
    
        data/lib/mtp/datacode.rb
    ADDED
    
    | @@ -0,0 +1,485 @@ | |
| 1 | 
            +
            module MTP
         | 
| 2 | 
            +
              class Datacode 
         | 
| 3 | 
            +
                module Masks
         | 
| 4 | 
            +
                  UNDEFINED =       0B0000000000000000
         | 
| 5 | 
            +
                  OPERATION =       0B0001000000000000
         | 
| 6 | 
            +
                  RESPONSE  =       0B0010000000000000
         | 
| 7 | 
            +
                  OBJECT_FORMAT =   0B0011000000000000
         | 
| 8 | 
            +
                  EVENT =           0B0100000000000000
         | 
| 9 | 
            +
                  DEVICE_PROPERTY = 0B0101000000000000
         | 
| 10 | 
            +
                  OBJECT_PROPERTY = 0B1101110000000000
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
                  
         | 
| 13 | 
            +
                @@name_codes = {}
         | 
| 14 | 
            +
                attr_reader :name    
         | 
| 15 | 
            +
                def initialize(code, hash = nil, mask = nil)
         | 
| 16 | 
            +
                  hash = CODE_NAMES if hash.nil?
         | 
| 17 | 
            +
                  if code.is_a?(String)
         | 
| 18 | 
            +
                    @name = code
         | 
| 19 | 
            +
                    hash.each do |c, value|
         | 
| 20 | 
            +
                      if value == code and (mask.nil? or (c & mask) == mask)
         | 
| 21 | 
            +
                        @code = c
         | 
| 22 | 
            +
                        break
         | 
| 23 | 
            +
                      end
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                    raise RuntimeError.new("unknown data code: #{code}") if @code.nil?
         | 
| 26 | 
            +
                  else
         | 
| 27 | 
            +
                    @code = code
         | 
| 28 | 
            +
                    @name = hash[@code]
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                  self.freeze
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                
         | 
| 33 | 
            +
                def ==(object)
         | 
| 34 | 
            +
                  @code.to_i == object.to_i
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
                
         | 
| 37 | 
            +
                def to_s
         | 
| 38 | 
            +
                  @name
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def to_int
         | 
| 42 | 
            +
                  @code.to_int
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
                
         | 
| 45 | 
            +
                def method_missing(method, *args)
         | 
| 46 | 
            +
                  @code.send(method, *args)
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def inspect
         | 
| 50 | 
            +
                  "<Datacode 0x%04x:%s>" % [ @code, @name ]
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
                
         | 
| 53 | 
            +
                CODE_NAMES = {
         | 
| 54 | 
            +
                  0x0000 => nil,
         | 
| 55 | 
            +
                  0x1000 => "Undefined",
         | 
| 56 | 
            +
                  0x1001 => "GetDeviceInfo",
         | 
| 57 | 
            +
                  0x1002 => "OpenSession",
         | 
| 58 | 
            +
                  0x1003 => "CloseSession",
         | 
| 59 | 
            +
                  0x1004 => "GetStorageIds",
         | 
| 60 | 
            +
                  0x1005 => "GetStorageInfo",
         | 
| 61 | 
            +
                  0x1006 => "GetNumObjects",
         | 
| 62 | 
            +
                  0x1007 => "GetObjectHandles",
         | 
| 63 | 
            +
                  0x1008 => "GetObjectInfo",
         | 
| 64 | 
            +
                  0x1009 => "GetObject",
         | 
| 65 | 
            +
                  0x100A => "GetThumb",
         | 
| 66 | 
            +
                  0x100B => "DeleteObject",
         | 
| 67 | 
            +
                  0x100C => "SendObjectInfo",
         | 
| 68 | 
            +
                  0x100D => "SendObject",
         | 
| 69 | 
            +
                  0x100E => "InitiateCapture",
         | 
| 70 | 
            +
                  0x100F => "FormatStore",
         | 
| 71 | 
            +
                  0x1010 => "ResetDevice",
         | 
| 72 | 
            +
                  0x1011 => "SelfTest",
         | 
| 73 | 
            +
                  0x1012 => "SetObjectProtection",
         | 
| 74 | 
            +
                  0x1013 => "PowerDown",
         | 
| 75 | 
            +
                  0x1014 => "GetDevicePropDesc",
         | 
| 76 | 
            +
                  0x1015 => "GetDevicePropValue",
         | 
| 77 | 
            +
                  0x1016 => "SetDevicePropValue",
         | 
| 78 | 
            +
                  0x1017 => "ResetDevicePropValue",
         | 
| 79 | 
            +
                  0x1018 => "TerminateOpenCapture",
         | 
| 80 | 
            +
                  0x1019 => "MoveObject",
         | 
| 81 | 
            +
                  0x101A => "CopyObject",
         | 
| 82 | 
            +
                  0x101B => "GetPartialObject",
         | 
| 83 | 
            +
                  0x101C => "InitiateOpenCapture",
         | 
| 84 | 
            +
                  0x9801 => "GetObjectPropsSupported",
         | 
| 85 | 
            +
                  0x9802 => "GetObjectPropDesc",
         | 
| 86 | 
            +
                  0x9803 => "GetObjectPropValue",
         | 
| 87 | 
            +
                  0x9804 => "SetObjectPropValue",
         | 
| 88 | 
            +
                  0x9805 => "GetObjPropList",
         | 
| 89 | 
            +
                  0x9806 => "SetObjPropList",
         | 
| 90 | 
            +
                  0x9807 => "GetInterdependendPropdesc",
         | 
| 91 | 
            +
                  0x9808 => "SendObjectPropList",
         | 
| 92 | 
            +
                  0x9810 => "GetObjectReferences",
         | 
| 93 | 
            +
                  0x9811 => "SetObjectReferences",
         | 
| 94 | 
            +
                  0x9812 => "UpdateDeviceFirmware",
         | 
| 95 | 
            +
                  0x9820 => "Skip",
         | 
| 96 | 
            +
                  0x9101 => "GetSecureTimeChallenge",
         | 
| 97 | 
            +
                  0x9102 => "GetSecureTimeResponse",
         | 
| 98 | 
            +
                  0x9103 => "SetLicenseResponse",
         | 
| 99 | 
            +
                  0x9104 => "GetSyncList",
         | 
| 100 | 
            +
                  0x9105 => "SendMeterChallengeQuery",
         | 
| 101 | 
            +
                  0x9106 => "GetMeterChallenge",
         | 
| 102 | 
            +
                  0x9107 => "SetMeterResponse",
         | 
| 103 | 
            +
                  0x9108 => "CleanDataStore",
         | 
| 104 | 
            +
                  0x9109 => "GetLicenseState",
         | 
| 105 | 
            +
                  0x910A => "SendWMDRMPDCommand",
         | 
| 106 | 
            +
                  0x910B => "SendWMDRMPDRequest",
         | 
| 107 | 
            +
                  0x9212 => "SendWMDRMPDAppRequest",
         | 
| 108 | 
            +
                  0x9213 => "GetWMDRMPDAppResponse",
         | 
| 109 | 
            +
                  0x9214 => "EnableTrustedFilesOperations",
         | 
| 110 | 
            +
                  0x9215 => "DisableTrustedFilesOperations",
         | 
| 111 | 
            +
                  0x9216 => "EndTrustedAppSession",
         | 
| 112 | 
            +
                  0x9170 => "OpenMediaSession1",
         | 
| 113 | 
            +
                  0x9171 => "OpenMediaSession2",
         | 
| 114 | 
            +
                  0x9172 => "GetNextDataBlock",
         | 
| 115 | 
            +
                  0x9173 => "SetCurrentTimePosition",
         | 
| 116 | 
            +
                  0x9180 => "SendRegistrationRequest",
         | 
| 117 | 
            +
                  0x9181 => "GetRegistrationResponse",
         | 
| 118 | 
            +
                  0x9182 => "GetProximityChallenge",
         | 
| 119 | 
            +
                  0x9183 => "SendProximityResponse",
         | 
| 120 | 
            +
                  0x9184 => "SendWMDRMNDLicenseRequest",
         | 
| 121 | 
            +
                  0x9185 => "GetWMDRMNDLicenseResponse",
         | 
| 122 | 
            +
                  0x9201 => "ReportAddedDeletedItems",
         | 
| 123 | 
            +
                  0x9202 => "ReportAcquiredItems",
         | 
| 124 | 
            +
                  0x9203 => "PlaylistObjectPref",
         | 
| 125 | 
            +
                  0x2000 => "Undefined",
         | 
| 126 | 
            +
                  0x2001 => "OK",
         | 
| 127 | 
            +
                  0x2002 => "GeneralError",
         | 
| 128 | 
            +
                  0x2003 => "SessionNotOpen",
         | 
| 129 | 
            +
                  0x2004 => "InvalidTransactionID",
         | 
| 130 | 
            +
                  0x2005 => "OperationNotSupported",
         | 
| 131 | 
            +
                  0x2006 => "ParameterNotSupported",
         | 
| 132 | 
            +
                  0x2007 => "IncompleteTransfer",
         | 
| 133 | 
            +
                  0x2008 => "InvalidStorageId",
         | 
| 134 | 
            +
                  0x2009 => "InvalidObjectHandle",
         | 
| 135 | 
            +
                  0x200A => "DevicePropNotSupported",
         | 
| 136 | 
            +
                  0x200B => "InvalidObjectFormatCode",
         | 
| 137 | 
            +
                  0x200C => "StoreFull",
         | 
| 138 | 
            +
                  0x200D => "ObjectWriteProtected",
         | 
| 139 | 
            +
                  0x200E => "StoreReadOnly",
         | 
| 140 | 
            +
                  0x200F => "AccessDenied",
         | 
| 141 | 
            +
                  0x2010 => "NoThumbnailPresent",
         | 
| 142 | 
            +
                  0x2011 => "SelfTestFailed",
         | 
| 143 | 
            +
                  0x2012 => "PartialDeletion",
         | 
| 144 | 
            +
                  0x2013 => "StoreNotAvailable",
         | 
| 145 | 
            +
                  0x2014 => "SpecificationByFormatUnsupported",
         | 
| 146 | 
            +
                  0x2015 => "NoValidObjectInfo",
         | 
| 147 | 
            +
                  0x2016 => "InvalidCodeFormat",
         | 
| 148 | 
            +
                  0x2017 => "UnknownVendorCode",
         | 
| 149 | 
            +
                  0x2018 => "CaptureAlreadyTerminated",
         | 
| 150 | 
            +
                  0x2019 => "DeviceBusy",
         | 
| 151 | 
            +
                  0x201A => "InvalidParentObject",
         | 
| 152 | 
            +
                  0x201B => "InvalidDevicePropFormat",
         | 
| 153 | 
            +
                  0x201C => "InvalidDevicePropValue",
         | 
| 154 | 
            +
                  0x201D => "InvalidParameter",
         | 
| 155 | 
            +
                  0x201E => "SessionAlreadyOpened",
         | 
| 156 | 
            +
                  0x201F => "TransactionCanceled",
         | 
| 157 | 
            +
                  0x2020 => "SpecificationOfDestinationUnsupported",
         | 
| 158 | 
            +
                  0x4000 => "Undefined",
         | 
| 159 | 
            +
                  0x4001 => "CancelTransaction",
         | 
| 160 | 
            +
                  0x4002 => "ObjectAdded",
         | 
| 161 | 
            +
                  0x4003 => "ObjectRemoved",
         | 
| 162 | 
            +
                  0x4004 => "StoreAdded",
         | 
| 163 | 
            +
                  0x4005 => "StoreRemoved",
         | 
| 164 | 
            +
                  0x4006 => "DevicePropChanged",
         | 
| 165 | 
            +
                  0x4007 => "ObjectInfoChanged",
         | 
| 166 | 
            +
                  0x4008 => "DeviceInfoChanged",
         | 
| 167 | 
            +
                  0x4009 => "RequestObjectTransfer",
         | 
| 168 | 
            +
                  0x400A => "StoreFull",
         | 
| 169 | 
            +
                  0x400B => "DeviceReset",
         | 
| 170 | 
            +
                  0x400C => "StorageInfoChanged",
         | 
| 171 | 
            +
                  0x400D => "CaptureComplete",
         | 
| 172 | 
            +
                  0x400E => "UnreportedStatus",
         | 
| 173 | 
            +
                  0x3000 => "Undefined",
         | 
| 174 | 
            +
                  0x3800 => "Defined",
         | 
| 175 | 
            +
                  0x3001 => "Association",
         | 
| 176 | 
            +
                  0x3002 => "Script",
         | 
| 177 | 
            +
                  0x3003 => "Executable",
         | 
| 178 | 
            +
                  0x3004 => "Text",
         | 
| 179 | 
            +
                  0x3005 => "HTML",
         | 
| 180 | 
            +
                  0x3006 => "DPOF",
         | 
| 181 | 
            +
                  0x3007 => "AIFF",
         | 
| 182 | 
            +
                  0x3008 => "WAV",
         | 
| 183 | 
            +
                  0x3009 => "MP3",
         | 
| 184 | 
            +
                  0x300A => "AVI",
         | 
| 185 | 
            +
                  0x300B => "MPEG",
         | 
| 186 | 
            +
                  0x300C => "ASF",
         | 
| 187 | 
            +
                  0x300D => "QT",
         | 
| 188 | 
            +
                  0x3801 => "EXIF_JPEG",
         | 
| 189 | 
            +
                  0x3802 => "TIFF_EP",
         | 
| 190 | 
            +
                  0x3803 => "FlashPix",
         | 
| 191 | 
            +
                  0x3804 => "BMP",
         | 
| 192 | 
            +
                  0x3805 => "CIFF",
         | 
| 193 | 
            +
                  0x3806 => "Undefined_0x3806",
         | 
| 194 | 
            +
                  0x3807 => "GIF",
         | 
| 195 | 
            +
                  0x3808 => "JFIF",
         | 
| 196 | 
            +
                  0x3809 => "PCD",
         | 
| 197 | 
            +
                  0x380A => "PICT",
         | 
| 198 | 
            +
                  0x380B => "PNG",
         | 
| 199 | 
            +
                  0x380C => "Undefined_0x380C",
         | 
| 200 | 
            +
                  0x380D => "TIFF",
         | 
| 201 | 
            +
                  0x380E => "TIFF_IT",
         | 
| 202 | 
            +
                  0x380F => "JP2",
         | 
| 203 | 
            +
                  0x3810 => "JPX",
         | 
| 204 | 
            +
                  0xb002 => "EK_M3U",
         | 
| 205 | 
            +
                  0xb211 => "MediaCard",
         | 
| 206 | 
            +
                  0xb212 => "MediaCardGroup",
         | 
| 207 | 
            +
                  0xb213 => "Encounter",
         | 
| 208 | 
            +
                  0xb214 => "EncounterBox",
         | 
| 209 | 
            +
                  0xb215 => "M4A",
         | 
| 210 | 
            +
                  0xb217 => "ZUNEUNDEFINED",
         | 
| 211 | 
            +
                  0xb802 => "Firmware",
         | 
| 212 | 
            +
                  0xb881 => "WindowsImageFormat",
         | 
| 213 | 
            +
                  0xb900 => "UndefinedAudio",
         | 
| 214 | 
            +
                  0xb901 => "WMA",
         | 
| 215 | 
            +
                  0xb902 => "OGG",
         | 
| 216 | 
            +
                  0xb903 => "AAC",
         | 
| 217 | 
            +
                  0xb904 => "AudibleCodec",
         | 
| 218 | 
            +
                  0xb906 => "FLAC",
         | 
| 219 | 
            +
                  0xb980 => "UndefinedVideo",
         | 
| 220 | 
            +
                  0xb981 => "WMV",
         | 
| 221 | 
            +
                  0xb982 => "MP4",
         | 
| 222 | 
            +
                  0xb983 => "MP2",
         | 
| 223 | 
            +
                  0xb984 => "3GP",
         | 
| 224 | 
            +
                  0xba00 => "UndefinedCollection",
         | 
| 225 | 
            +
                  0xba01 => "AbstractMultimediaAlbum",
         | 
| 226 | 
            +
                  0xba02 => "AbstractImageAlbum",
         | 
| 227 | 
            +
                  0xba03 => "AbstractAudioAlbum",
         | 
| 228 | 
            +
                  0xba04 => "AbstractVideoAlbum",
         | 
| 229 | 
            +
                  0xba05 => "AbstractAudioVideoPlaylist",
         | 
| 230 | 
            +
                  0xba06 => "AbstractContactGroup",
         | 
| 231 | 
            +
                  0xba07 => "AbstractMessageFolder",
         | 
| 232 | 
            +
                  0xba08 => "AbstractChapteredProduction",
         | 
| 233 | 
            +
                  0xba09 => "AbstractAudioPlaylist",
         | 
| 234 | 
            +
                  0xba0a => "AbstractVideoPlaylist",
         | 
| 235 | 
            +
                  0xba0b => "AbstractMediacast",
         | 
| 236 | 
            +
                  0xba10 => "WPLPlaylist",
         | 
| 237 | 
            +
                  0xba11 => "M3UPlaylist",
         | 
| 238 | 
            +
                  0xba12 => "MPLPlaylist",
         | 
| 239 | 
            +
                  0xba13 => "ASXPlaylist",
         | 
| 240 | 
            +
                  0xba14 => "PLSPlaylist",
         | 
| 241 | 
            +
                  0xba80 => "UndefinedDocument",
         | 
| 242 | 
            +
                  0xba81 => "AbstractDocument",
         | 
| 243 | 
            +
                  0xba82 => "XMLDocument",
         | 
| 244 | 
            +
                  0xba83 => "MSWordDocument",
         | 
| 245 | 
            +
                  0xba84 => "MHTCompiledHTMLDocument",
         | 
| 246 | 
            +
                  0xba85 => "MSExcelSpreadsheetXLS",
         | 
| 247 | 
            +
                  0xba86 => "MSPowerpointPresentationPPT",
         | 
| 248 | 
            +
                  0xbb00 => "UndefinedMessage",
         | 
| 249 | 
            +
                  0xbb01 => "AbstractMessage",
         | 
| 250 | 
            +
                  0xbb80 => "UndefinedContact",
         | 
| 251 | 
            +
                  0xbb81 => "AbstractContact",
         | 
| 252 | 
            +
                  0xbb82 => "vCard2",
         | 
| 253 | 
            +
                  0xbb83 => "vCard3",
         | 
| 254 | 
            +
                  0xbe00 => "UndefinedCalendarItem",
         | 
| 255 | 
            +
                  0xbe01 => "AbstractCalendarItem",
         | 
| 256 | 
            +
                  0xbe02 => "vCalendar1",
         | 
| 257 | 
            +
                  0xbe03 => "vCalendar2",
         | 
| 258 | 
            +
                  0xbe80 => "UndefinedWindowsExecutable",
         | 
| 259 | 
            +
                  0x5000 => "Undefined",
         | 
| 260 | 
            +
                  0x5001 => "BatteryLevel",
         | 
| 261 | 
            +
                  0x5002 => "FunctionalMode",
         | 
| 262 | 
            +
                  0x5003 => "ImageSize",
         | 
| 263 | 
            +
                  0x5004 => "CompressionSetting",
         | 
| 264 | 
            +
                  0x5005 => "WhiteBalance",
         | 
| 265 | 
            +
                  0x5006 => "RGBGain",	
         | 
| 266 | 
            +
                  0x5007 => "FNumber",	
         | 
| 267 | 
            +
                  0x5008 => "FocalLength",
         | 
| 268 | 
            +
                  0x5009 => "FocusDistance",
         | 
| 269 | 
            +
                  0x500A => "FocusMode",
         | 
| 270 | 
            +
                  0x500B => "ExposureMeteringMode",
         | 
| 271 | 
            +
                  0x500C => "FlashMode",
         | 
| 272 | 
            +
                  0x500D => "ExposureTime",
         | 
| 273 | 
            +
                  0x500E => "ExposureProgramMode",
         | 
| 274 | 
            +
                  0x500F => "ExposureIndex",
         | 
| 275 | 
            +
                  0x5010 => "ExposureBiasCompensation",
         | 
| 276 | 
            +
                  0x5011 => "DateTime",
         | 
| 277 | 
            +
                  0x5012 => "CaptureDelay",
         | 
| 278 | 
            +
                  0x5013 => "StillCaptureMode",
         | 
| 279 | 
            +
                  0x5014 => "Contrast",
         | 
| 280 | 
            +
                  0x5015 => "Sharpness",
         | 
| 281 | 
            +
                  0x5016 => "DigitalZoom",
         | 
| 282 | 
            +
                  0x5017 => "EffectMode",
         | 
| 283 | 
            +
                  0x5018 => "BurstNumber",
         | 
| 284 | 
            +
                  0x5019 => "BurstInterval",
         | 
| 285 | 
            +
                  0x501A => "TimelapseNumber",
         | 
| 286 | 
            +
                  0x501B => "TimelapseInterval",
         | 
| 287 | 
            +
                  0x501C => "FocusMeteringMode",
         | 
| 288 | 
            +
                  0x501D => "UploadURL",
         | 
| 289 | 
            +
                  0x501E => "Artist",
         | 
| 290 | 
            +
                  0x501F => "CopyrightInfo",
         | 
| 291 | 
            +
                  0xD181 => "ZUNE_UNKNOWN1",
         | 
| 292 | 
            +
                  0xD132 => "ZUNE_UNKNOWN2",
         | 
| 293 | 
            +
                  0xD215 => "ZUNE_UNKNOWN3",
         | 
| 294 | 
            +
                  0xD216 => "ZUNE_UNKNOWN4",
         | 
| 295 | 
            +
                  0xD101 => "SecureTime",
         | 
| 296 | 
            +
                  0xD102 => "DeviceCertificate",
         | 
| 297 | 
            +
                  0xD103 => "RevocationInfo",
         | 
| 298 | 
            +
                  0xD401 => "SynchronizationPartner",
         | 
| 299 | 
            +
                  0xD402 => "DeviceFriendlyName",
         | 
| 300 | 
            +
                  0xD403 => "VolumeLevel",
         | 
| 301 | 
            +
                  0xD405 => "DeviceIcon",
         | 
| 302 | 
            +
                  0xD410 => "PlaybackRate",
         | 
| 303 | 
            +
                  0xD411 => "PlaybackObject",
         | 
| 304 | 
            +
                  0xD412 => "PlaybackContainerIndex",
         | 
| 305 | 
            +
                  0xD413 => "PlaybackPosition",
         | 
| 306 | 
            +
                  0xD131 => "PlaysForSureID",
         | 
| 307 | 
            +
                  0xD181 => "Zune_UnknownVersion",
         | 
| 308 | 
            +
                  0xDC01 => "StorageID",
         | 
| 309 | 
            +
                  0xDC02 => "ObjectFormat",
         | 
| 310 | 
            +
                  0xDC03 => "ProtectionStatus",
         | 
| 311 | 
            +
                  0xDC04 => "ObjectSize",
         | 
| 312 | 
            +
                  0xDC05 => "AssociationType",
         | 
| 313 | 
            +
                  0xDC06 => "AssociationDesc",
         | 
| 314 | 
            +
                  0xDC07 => "ObjectFileName",
         | 
| 315 | 
            +
                  0xDC08 => "DateCreated",
         | 
| 316 | 
            +
                  0xDC09 => "DateModified",
         | 
| 317 | 
            +
                  0xDC0A => "Keywords",
         | 
| 318 | 
            +
                  0xDC0B => "ParentObject",
         | 
| 319 | 
            +
                  0xDC0C => "AllowedFolderContents",
         | 
| 320 | 
            +
                  0xDC0D => "Hidden",
         | 
| 321 | 
            +
                  0xDC0E => "SystemObject",
         | 
| 322 | 
            +
                  0xDC41 => "PersistantUniqueObjectIdentifier",
         | 
| 323 | 
            +
                  0xDC42 => "SyncID",
         | 
| 324 | 
            +
                  0xDC43 => "PropertyBag",
         | 
| 325 | 
            +
                  0xDC44 => "Name",
         | 
| 326 | 
            +
                  0xDC45 => "CreatedBy",
         | 
| 327 | 
            +
                  0xDC46 => "Artist",
         | 
| 328 | 
            +
                  0xDC47 => "DateAuthored",
         | 
| 329 | 
            +
                  0xDC48 => "Description",
         | 
| 330 | 
            +
                  0xDC49 => "URLReference",
         | 
| 331 | 
            +
                  0xDC4A => "LanguageLocale",
         | 
| 332 | 
            +
                  0xDC4B => "CopyrightInformation",
         | 
| 333 | 
            +
                  0xDC4C => "Source",
         | 
| 334 | 
            +
                  0xDC4D => "OriginLocation",
         | 
| 335 | 
            +
                  0xDC4E => "DateAdded",
         | 
| 336 | 
            +
                  0xDC4F => "NonConsumable",
         | 
| 337 | 
            +
                  0xDC50 => "CorruptOrUnplayable",
         | 
| 338 | 
            +
                  0xDC51 => "ProducerSerialNumber",
         | 
| 339 | 
            +
                  0xDC81 => "RepresentativeSampleFormat",
         | 
| 340 | 
            +
                  0xDC82 => "RepresentativeSampleSize",
         | 
| 341 | 
            +
                  0xDC83 => "RepresentativeSampleHeight",
         | 
| 342 | 
            +
                  0xDC84 => "RepresentativeSampleWidth",
         | 
| 343 | 
            +
                  0xDC85 => "RepresentativeSampleDuration",
         | 
| 344 | 
            +
                  0xDC86 => "RepresentativeSampleData",
         | 
| 345 | 
            +
                  0xDC87 => "Width",
         | 
| 346 | 
            +
                  0xDC88 => "Height",
         | 
| 347 | 
            +
                  0xDC89 => "Duration",
         | 
| 348 | 
            +
                  0xDC8A => "Rating",
         | 
| 349 | 
            +
                  0xDC8B => "Track",
         | 
| 350 | 
            +
                  0xDC8C => "Genre",
         | 
| 351 | 
            +
                  0xDC8D => "Credits",
         | 
| 352 | 
            +
                  0xDC8E => "Lyrics",
         | 
| 353 | 
            +
                  0xDC8F => "SubscriptionContentID",
         | 
| 354 | 
            +
                  0xDC90 => "ProducedBy",
         | 
| 355 | 
            +
                  0xDC91 => "UseCount",
         | 
| 356 | 
            +
                  0xDC92 => "SkipCount",
         | 
| 357 | 
            +
                  0xDC93 => "LastAccessed",
         | 
| 358 | 
            +
                  0xDC94 => "ParentalRating",
         | 
| 359 | 
            +
                  0xDC95 => "MetaGenre",
         | 
| 360 | 
            +
                  0xDC96 => "Composer",
         | 
| 361 | 
            +
                  0xDC97 => "EffectiveRating",
         | 
| 362 | 
            +
                  0xDC98 => "Subtitle",
         | 
| 363 | 
            +
                  0xDC99 => "OriginalReleaseDate",
         | 
| 364 | 
            +
                  0xDC9A => "AlbumName",
         | 
| 365 | 
            +
                  0xDC9B => "AlbumArtist",
         | 
| 366 | 
            +
                  0xDC9C => "Mood",
         | 
| 367 | 
            +
                  0xDC9D => "DRMStatus",
         | 
| 368 | 
            +
                  0xDC9E => "SubDescription",
         | 
| 369 | 
            +
                  0xDCD1 => "IsCropped",
         | 
| 370 | 
            +
                  0xDCD2 => "IsColorCorrected",
         | 
| 371 | 
            +
                  0xDCD3 => "ImageBitDepth",
         | 
| 372 | 
            +
                  0xDCD4 => "Fnumber",
         | 
| 373 | 
            +
                  0xDCD5 => "ExposureTime",
         | 
| 374 | 
            +
                  0xDCD6 => "ExposureIndex",
         | 
| 375 | 
            +
                  0xDCE0 => "DisplayName",
         | 
| 376 | 
            +
                  0xDCE1 => "BodyText",
         | 
| 377 | 
            +
                  0xDCE2 => "Subject",
         | 
| 378 | 
            +
                  0xDCE3 => "Prority",
         | 
| 379 | 
            +
                  0xDD00 => "GivenName",
         | 
| 380 | 
            +
                  0xDD01 => "MiddleNames",
         | 
| 381 | 
            +
                  0xDD02 => "FamilyName",
         | 
| 382 | 
            +
                  0xDD03 => "Prefix",
         | 
| 383 | 
            +
                  0xDD04 => "Suffix",
         | 
| 384 | 
            +
                  0xDD05 => "PhoneticGivenName",
         | 
| 385 | 
            +
                  0xDD06 => "PhoneticFamilyName",
         | 
| 386 | 
            +
                  0xDD07 => "EmailPrimary",
         | 
| 387 | 
            +
                  0xDD08 => "EmailPersonal1",
         | 
| 388 | 
            +
                  0xDD09 => "EmailPersonal2",
         | 
| 389 | 
            +
                  0xDD0A => "EmailBusiness1",
         | 
| 390 | 
            +
                  0xDD0B => "EmailBusiness2",
         | 
| 391 | 
            +
                  0xDD0C => "EmailOthers",
         | 
| 392 | 
            +
                  0xDD0D => "PhoneNumberPrimary",
         | 
| 393 | 
            +
                  0xDD0E => "PhoneNumberPersonal",
         | 
| 394 | 
            +
                  0xDD0F => "PhoneNumberPersonal2",
         | 
| 395 | 
            +
                  0xDD10 => "PhoneNumberBusiness",
         | 
| 396 | 
            +
                  0xDD11 => "PhoneNumberBusiness2",
         | 
| 397 | 
            +
                  0xDD12 => "PhoneNumberMobile",
         | 
| 398 | 
            +
                  0xDD13 => "PhoneNumberMobile2",
         | 
| 399 | 
            +
                  0xDD14 => "FaxNumberPrimary",
         | 
| 400 | 
            +
                  0xDD15 => "FaxNumberPersonal",
         | 
| 401 | 
            +
                  0xDD16 => "FaxNumberBusiness",
         | 
| 402 | 
            +
                  0xDD17 => "PagerNumber",
         | 
| 403 | 
            +
                  0xDD18 => "PhoneNumberOthers",
         | 
| 404 | 
            +
                  0xDD19 => "PrimaryWebAddress",
         | 
| 405 | 
            +
                  0xDD1A => "PersonalWebAddress",
         | 
| 406 | 
            +
                  0xDD1B => "BusinessWebAddress",
         | 
| 407 | 
            +
                  0xDD1C => "InstantMessengerAddress",
         | 
| 408 | 
            +
                  0xDD1D => "InstantMessengerAddress2",
         | 
| 409 | 
            +
                  0xDD1E => "InstantMessengerAddress3",
         | 
| 410 | 
            +
                  0xDD1F => "PostalAddressPersonalFull",
         | 
| 411 | 
            +
                  0xDD20 => "PostalAddressPersonalFullLine1",
         | 
| 412 | 
            +
                  0xDD21 => "PostalAddressPersonalFullLine2",
         | 
| 413 | 
            +
                  0xDD22 => "PostalAddressPersonalFullCity",
         | 
| 414 | 
            +
                  0xDD23 => "PostalAddressPersonalFullRegion",
         | 
| 415 | 
            +
                  0xDD24 => "PostalAddressPersonalFullPostalCode",
         | 
| 416 | 
            +
                  0xDD25 => "PostalAddressPersonalFullCountry",
         | 
| 417 | 
            +
                  0xDD26 => "PostalAddressBusinessFull",
         | 
| 418 | 
            +
                  0xDD27 => "PostalAddressBusinessLine1",
         | 
| 419 | 
            +
                  0xDD28 => "PostalAddressBusinessLine2",
         | 
| 420 | 
            +
                  0xDD29 => "PostalAddressBusinessCity",
         | 
| 421 | 
            +
                  0xDD2A => "PostalAddressBusinessRegion",
         | 
| 422 | 
            +
                  0xDD2B => "PostalAddressBusinessPostalCode",
         | 
| 423 | 
            +
                  0xDD2C => "PostalAddressBusinessCountry",
         | 
| 424 | 
            +
                  0xDD2D => "PostalAddressOtherFull",
         | 
| 425 | 
            +
                  0xDD2E => "PostalAddressOtherLine1",
         | 
| 426 | 
            +
                  0xDD2F => "PostalAddressOtherLine2",
         | 
| 427 | 
            +
                  0xDD30 => "PostalAddressOtherCity",
         | 
| 428 | 
            +
                  0xDD31 => "PostalAddressOtherRegion",
         | 
| 429 | 
            +
                  0xDD32 => "PostalAddressOtherPostalCode",
         | 
| 430 | 
            +
                  0xDD33 => "PostalAddressOtherCountry",
         | 
| 431 | 
            +
                  0xDD34 => "OrganizationName",
         | 
| 432 | 
            +
                  0xDD35 => "PhoneticOrganizationName",
         | 
| 433 | 
            +
                  0xDD36 => "Role",
         | 
| 434 | 
            +
                  0xDD37 => "Birthdate",
         | 
| 435 | 
            +
                  0xDD40 => "MessageTo",
         | 
| 436 | 
            +
                  0xDD41 => "MessageCC",
         | 
| 437 | 
            +
                  0xDD42 => "MessageBCC",
         | 
| 438 | 
            +
                  0xDD43 => "MessageRead",
         | 
| 439 | 
            +
                  0xDD44 => "MessageReceivedTime",
         | 
| 440 | 
            +
                  0xDD45 => "MessageSender",
         | 
| 441 | 
            +
                  0xDD50 => "ActivityBeginTime",
         | 
| 442 | 
            +
                  0xDD51 => "ActivityEndTime",
         | 
| 443 | 
            +
                  0xDD52 => "ActivityLocation",
         | 
| 444 | 
            +
                  0xDD54 => "ActivityRequiredAttendees",
         | 
| 445 | 
            +
                  0xDD55 => "ActivityOptionalAttendees",
         | 
| 446 | 
            +
                  0xDD56 => "ActivityResources",
         | 
| 447 | 
            +
                  0xDD57 => "ActivityAccepted",
         | 
| 448 | 
            +
                  0xDD5D => "Owner",
         | 
| 449 | 
            +
                  0xDD5E => "Editor",
         | 
| 450 | 
            +
                  0xDD5F => "Webmaster",
         | 
| 451 | 
            +
                  0xDD60 => "URLSource",
         | 
| 452 | 
            +
                  0xDD61 => "URLDestination",
         | 
| 453 | 
            +
                  0xDD62 => "TimeBookmark",
         | 
| 454 | 
            +
                  0xDD63 => "ObjectBookmark",
         | 
| 455 | 
            +
                  0xDD64 => "ByteBookmark",
         | 
| 456 | 
            +
                  0xDD70 => "LastBuildDate",
         | 
| 457 | 
            +
                  0xDD71 => "TimetoLive",
         | 
| 458 | 
            +
                  0xDD72 => "MediaGUID",
         | 
| 459 | 
            +
                  0xDE91 => "TotalBitRate",
         | 
| 460 | 
            +
                  0xDE92 => "BitRateType",
         | 
| 461 | 
            +
                  0xDE93 => "SampleRate",
         | 
| 462 | 
            +
                  0xDE94 => "NumberOfChannels",
         | 
| 463 | 
            +
                  0xDE95 => "AudioBitDepth",
         | 
| 464 | 
            +
                  0xDE97 => "ScanDepth",
         | 
| 465 | 
            +
                  0xDE99 => "AudioWaveCodec",
         | 
| 466 | 
            +
                  0xDE9A => "AudioBitRate",
         | 
| 467 | 
            +
                  0xDE9B => "VideoFourCCCodec",
         | 
| 468 | 
            +
                  0xDE9C => "VideoBitRate",
         | 
| 469 | 
            +
                  0xDE9D => "FramesPerThousandSeconds",
         | 
| 470 | 
            +
                  0xDE9E => "KeyFrameDistance",
         | 
| 471 | 
            +
                  0xDE9F => "BufferSize",
         | 
| 472 | 
            +
                  0xDEA0 => "EncodingQuality",
         | 
| 473 | 
            +
                  0xD901 => "BuyFlag",
         | 
| 474 | 
            +
                  0xB104 => "WirelessConfigurationFile",
         | 
| 475 | 
            +
                  0xA800 => "MTP_Undefined",
         | 
| 476 | 
            +
                  0xA801 => "MTP_Invalid_ObjectPropCode",
         | 
| 477 | 
            +
                  0xA802 => "MTP_Invalid_ObjectProp_Format",
         | 
| 478 | 
            +
                  0xA803 => "MTP_Invalid_ObjectProp_Value",
         | 
| 479 | 
            +
                  0xA804 => "MTP_Invalid_ObjectReference",
         | 
| 480 | 
            +
                  0xA806 => "MTP_Invalid_Dataset",
         | 
| 481 | 
            +
                  0xA808 => "MTP_Specification_By_Group_Unsupported",
         | 
| 482 | 
            +
                  0xA809 => "MTP_Object_Too_Large"
         | 
| 483 | 
            +
                }
         | 
| 484 | 
            +
              end
         | 
| 485 | 
            +
            end
         |