Changeset 203

Show
Ignore:
Timestamp:
12/09/06 15:30:50 (2 years ago)
Author:
dconrad
Message:

Support for using data handlers that don't support 64-bit functions with Matroska.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/DataHandlerCallback.cpp

    r119 r203  
    4848{        
    4949        closeHandler = false; 
    50         mDataReader = mDataWriter = NULL; 
     50        supportsWideOffsets = true; 
     51        this->dataHandler = NULL; 
     52        mCurrentPosition = 0; 
     53        this->aMode = aMode; 
    5154         
    5255        switch (aMode) 
    5356        { 
    5457                case MODE_READ: 
    55                         mDataReader = dataHandler; 
    56                         break; 
    57                          
    5858                case MODE_WRITE: 
    59                         mDataWriter = dataHandler; 
     59                        this->dataHandler = dataHandler; 
    6060                        break; 
    6161                         
     
    6565        } 
    6666         
    67         mCurrentPosition = 0; 
     67        // figure out if we support wide offesets 
     68        getFileSize(); 
    6869} 
    6970 
     
    7475         
    7576        closeHandler = true; 
    76         mDataReader = mDataWriter = NULL; 
    77      
    78         switch (aMode) 
    79         { 
    80         case MODE_READ: 
     77        supportsWideOffsets = true; 
     78        dataHComponent = NULL; 
     79        mCurrentPosition = 0; 
     80        this->aMode = aMode; 
     81         
     82        if (aMode == MODE_READ) 
    8183                dataHComponent = GetDataHandler(dataRef, dataRefType, kDataHCanRead); 
    82         err = OpenAComponent(dataHComponent, &mDataReader); 
    83         if (err) { 
    84             stringstream Msg; 
    85             Msg << "Error opening data handler component " << err; 
    86             throw CRTError(Msg.str()); 
    87         } 
    88          
    89         err = DataHSetDataRef(mDataReader, dataRef); 
    90         if (err) { 
    91             stringstream Msg; 
    92             Msg << "Error setting data handler ref " << err; 
    93             throw CRTError(Msg.str()); 
    94         } 
    95          
    96                 err = DataHOpenForRead(mDataReader); 
     84        else if (aMode == MODE_WRITE) 
     85                dataHComponent = GetDataHandler(dataRef, dataRefType, kDataHCanWrite); 
     86        else 
     87                throw 0; 
     88         
     89        err = OpenAComponent(dataHComponent, &dataHandler); 
     90        if (err) { 
     91                stringstream Msg; 
     92                Msg << "Error opening data handler component " << err; 
     93                throw CRTError(Msg.str()); 
     94        } 
     95         
     96        err = DataHSetDataRef(dataHandler, dataRef); 
     97        if (err) { 
     98                stringstream Msg; 
     99                Msg << "Error setting data handler ref " << err; 
     100                throw CRTError(Msg.str()); 
     101        } 
     102         
     103        if (aMode == MODE_READ) { 
     104                err = DataHOpenForRead(dataHandler); 
    97105        if (err) { 
    98106            stringstream Msg; 
     
    100108            throw CRTError(Msg.str()); 
    101109        } 
    102                  
    103                 break; 
    104         case MODE_WRITE: 
    105                 dataHComponent = GetDataHandler(dataRef, dataRefType, kDataHCanWrite); 
    106         err = OpenAComponent(dataHComponent, &mDataWriter); 
    107         if (err) { 
    108             stringstream Msg; 
    109             Msg << "Error opening data handler component " << err; 
    110             throw CRTError(Msg.str()); 
    111         } 
    112                          
    113                 err = DataHSetDataRef(mDataWriter, dataRef); 
    114         if (err) { 
    115             stringstream Msg; 
    116             Msg << "Error setting data handler ref " << err; 
    117             throw CRTError(Msg.str()); 
    118         } 
    119                          
    120                 err = DataHOpenForWrite(mDataWriter); 
     110        } else if (aMode == MODE_WRITE) { 
     111                err = DataHOpenForWrite(dataHandler); 
    121112        if (err) { 
    122113            stringstream Msg; 
     
    124115            throw CRTError(Msg.str()); 
    125116        } 
     117        } else { 
     118                throw 0; 
     119        } 
     120         
     121        // figure out if we support wide offesets 
     122        getFileSize(); 
     123} 
     124 
     125 
     126DataHandlerCallback::~DataHandlerCallback() throw() 
     127{ 
     128        close(); 
     129} 
     130 
     131 
     132 
     133uint32 DataHandlerCallback::read(void *Buffer, size_t Size) 
     134{ 
     135        assert(dataHandler != 0); 
     136         
     137        ComponentResult err = noErr; 
     138         
     139        if (supportsWideOffsets) { 
     140                wide wideOffset = SInt64ToWide(mCurrentPosition); 
    126141                 
    127                 break; 
    128         default: 
    129                 throw 0; 
    130         } 
    131          
    132         mCurrentPosition = 0; 
    133 
    134  
    135  
    136 DataHandlerCallback::~DataHandlerCallback() throw() 
    137 
    138         close(); 
    139 
    140  
    141  
    142  
    143 uint32 DataHandlerCallback::read(void *Buffer, size_t Size) 
    144 
    145         assert(mDataReader != 0); 
    146          
    147         ComponentResult err = noErr; 
    148         wide wideOffset = SInt64ToWide((SInt64) mCurrentPosition); 
    149          
    150         err = DataHScheduleData64(mDataReader, (Ptr)Buffer, &wideOffset, Size, 0, NULL, NULL); 
     142                err = DataHScheduleData64(dataHandler, (Ptr)Buffer, &wideOffset, Size, 0, NULL, NULL); 
     143        } else { 
     144                err = DataHScheduleData(dataHandler, (Ptr)Buffer, mCurrentPosition, Size, 0, NULL, NULL); 
     145        } 
     146         
    151147        if (err) { 
    152148                stringstream Msg; 
     
    162158void DataHandlerCallback::setFilePointer(int64 Offset, LIBEBML_NAMESPACE::seek_mode Mode) 
    163159{ 
    164         assert(mDataReader != NULL || mDataWriter != NULL); 
    165  
    166160        assert(Offset <= LONG_MAX); 
    167161        assert(Offset >= LONG_MIN); 
    168162 
    169163        assert(Mode==SEEK_CUR||Mode==SEEK_END||Mode==SEEK_SET); 
    170          
    171         ComponentInstance dataHandler = mDataReader != NULL ? mDataReader : mDataWriter; 
    172164         
    173165        switch ( Mode ) 
     
    178170                case SEEK_END: 
    179171                        // I think this is what seeking this way does (was ftell(File)) 
    180                         wide filesize; 
    181                         DataHGetFileSize64(dataHandler, &filesize); 
    182                         mCurrentPosition = WideToSInt64(filesize) + Offset; 
     172                        mCurrentPosition = getFileSize() + Offset; 
    183173                        break; 
    184174                case SEEK_SET: 
     
    190180size_t DataHandlerCallback::write(const void *Buffer, size_t Size) 
    191181{ 
    192         assert(mDataWriter != NULL); 
     182        assert(dataHandler != NULL); 
    193183         
    194184        ComponentResult err = noErr; 
    195         wide wideOffset = SInt64ToWide((SInt64) mCurrentPosition); 
    196          
    197         err = DataHWrite64(mDataWriter, (Ptr)Buffer, &wideOffset, Size, NULL, 0); 
     185         
     186        if (supportsWideOffsets) { 
     187                wide wideOffset = SInt64ToWide(mCurrentPosition); 
     188                 
     189                err = DataHWrite64(dataHandler, (Ptr)Buffer, &wideOffset, Size, NULL, 0); 
     190        } else { 
     191                err = DataHWrite(dataHandler, (Ptr)Buffer, mCurrentPosition, Size, NULL, 0); 
     192        } 
     193         
    198194        if (err) { 
    199195                stringstream Msg; 
     
    209205uint64 DataHandlerCallback::getFilePointer() 
    210206{ 
    211         assert(mDataReader != NULL || mDataWriter != NULL); 
     207        assert(dataHandler != NULL); 
    212208 
    213209        return mCurrentPosition; 
     
    217213{ 
    218214        if (closeHandler) { 
    219                 if (mDataReader) { 
    220                         DataHCloseForRead(mDataReader); 
    221                         mDataReader = NULL; 
    222                 } 
    223                 if (mDataWriter) { 
    224                         DataHCloseForWrite(mDataWriter); 
    225                         mDataWriter = NULL; 
    226                 } 
     215                if (aMode == MODE_READ) 
     216                        DataHCloseForRead(dataHandler); 
     217                else if (aMode == MODE_WRITE) 
     218                        DataHCloseForWrite(dataHandler); 
     219                dataHandler = NULL; 
    227220        } 
    228221} 
     
    230223SInt64 DataHandlerCallback::getFileSize() 
    231224{ 
    232         wide filesize; 
    233         if (mDataReader) 
    234                 DataHGetFileSize64(mDataReader,&filesize); 
    235         else if (mDataWriter) 
    236                 DataHGetFileSize64(mDataWriter,&filesize); 
    237          
    238         return WideToSInt64(filesize); 
    239 
     225        ComponentResult err = noErr; 
     226        SInt64 filesize; 
     227        wide wideFilesize; 
     228         
     229        err = DataHGetFileSize64(dataHandler, &wideFilesize); 
     230        if (err == noErr) { 
     231                supportsWideOffsets = true; 
     232                filesize = WideToSInt64(wideFilesize); 
     233        } else { 
     234                long size32; 
     235                supportsWideOffsets = false; 
     236                DataHGetFileSize(dataHandler, &size32); 
     237                filesize = size32; 
     238        } 
     239         
     240        return filesize; 
     241
  • trunk/DataHandlerCallback.h

    r174 r203  
    5353{ 
    5454private: 
    55     ComponentInstance mDataReader; 
    56         ComponentInstance mDataWriter; 
    57     uint64 mCurrentPosition; 
     55        ComponentInstance dataHandler; 
     56        uint64 mCurrentPosition; 
    5857        bool closeHandler; 
     58        bool supportsWideOffsets; 
     59        open_mode aMode; 
    5960     
    6061public: