195 lines
6.7 KiB
C++
195 lines
6.7 KiB
C++
|
/*
|
||
|
*
|
||
|
* @APPLE_LICENSE_HEADER_START@
|
||
|
*
|
||
|
* Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
|
||
|
*
|
||
|
* This file contains Original Code and/or Modifications of Original Code
|
||
|
* as defined in and that are subject to the Apple Public Source License
|
||
|
* Version 2.0 (the 'License'). You may not use this file except in
|
||
|
* compliance with the License. Please obtain a copy of the License at
|
||
|
* http://www.opensource.apple.com/apsl/ and read it before using this
|
||
|
* file.
|
||
|
*
|
||
|
* The Original Code and all software distributed under the License are
|
||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||
|
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
||
|
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||
|
* Please see the License for the specific language governing rights and
|
||
|
* limitations under the License.
|
||
|
*
|
||
|
* @APPLE_LICENSE_HEADER_END@
|
||
|
*
|
||
|
*/
|
||
|
/*
|
||
|
File: QTSSFile.h
|
||
|
|
||
|
Contains:
|
||
|
|
||
|
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include "QTSSFile.h"
|
||
|
#include "QTSServerInterface.h"
|
||
|
|
||
|
QTSSAttrInfoDict::AttrInfo QTSSFile::sAttributes[] =
|
||
|
{ /*fields: fAttrName, fFuncPtr, fAttrDataType, fAttrPermission */
|
||
|
/* 0 */ { "qtssFlObjStream", NULL, qtssAttrDataTypeQTSS_StreamRef, qtssAttrModeRead | qtssAttrModePreempSafe },
|
||
|
/* 1 */ { "qtssFlObjFileSysModuleName", NULL, qtssAttrDataTypeCharArray, qtssAttrModeRead | qtssAttrModePreempSafe },
|
||
|
/* 2 */ { "qtssFlObjLength", NULL, qtssAttrDataTypeUInt64, qtssAttrModeRead | qtssAttrModePreempSafe | qtssAttrModeWrite },
|
||
|
/* 3 */ { "qtssFlObjPosition", NULL, qtssAttrDataTypeUInt64, qtssAttrModeRead | qtssAttrModePreempSafe },
|
||
|
/* 4 */ { "qtssFlObjModDate", NULL, qtssAttrDataTypeUInt64, qtssAttrModeRead | qtssAttrModePreempSafe | qtssAttrModeWrite }
|
||
|
};
|
||
|
|
||
|
void QTSSFile::Initialize()
|
||
|
{
|
||
|
for (UInt32 x = 0; x < qtssFlObjNumParams; x++)
|
||
|
QTSSDictionaryMap::GetMap(QTSSDictionaryMap::kFileDictIndex)->
|
||
|
SetAttribute(x, sAttributes[x].fAttrName, sAttributes[x].fFuncPtr, sAttributes[x].fAttrDataType, sAttributes[x].fAttrPermission);
|
||
|
}
|
||
|
|
||
|
QTSSFile::QTSSFile()
|
||
|
: QTSSDictionary(QTSSDictionaryMap::GetMap(QTSSDictionaryMap::kFileDictIndex)),
|
||
|
fModule(NULL),
|
||
|
fPosition(0),
|
||
|
fLength(0),
|
||
|
fModDate(0)
|
||
|
{
|
||
|
fThisPtr = this;
|
||
|
//
|
||
|
// The stream is just a pointer to this thing
|
||
|
this->SetVal(qtssFlObjStream, &fThisPtr, sizeof(fThisPtr));
|
||
|
this->SetVal(qtssFlObjLength, &fLength, sizeof(fLength));
|
||
|
this->SetVal(qtssFlObjPosition, &fPosition, sizeof(fPosition));
|
||
|
this->SetVal(qtssFlObjModDate, &fModDate, sizeof(fModDate));
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSSFile::Open(char* inPath, QTSS_OpenFileFlags inFlags)
|
||
|
{
|
||
|
//
|
||
|
// Because this is a role being executed from inside a callback, we need to
|
||
|
// make sure that QTSS_RequestEvent will not work.
|
||
|
Task* curTask = NULL;
|
||
|
QTSS_ModuleState* theState = (QTSS_ModuleState*)OSThread::GetMainThreadData();
|
||
|
if (OSThread::GetCurrent() != NULL)
|
||
|
theState = (QTSS_ModuleState*)OSThread::GetCurrent()->GetThreadData();
|
||
|
|
||
|
if (theState != NULL)
|
||
|
curTask = theState->curTask;
|
||
|
|
||
|
QTSS_RoleParams theParams;
|
||
|
theParams.openFileParams.inPath = inPath;
|
||
|
theParams.openFileParams.inFlags = inFlags;
|
||
|
theParams.openFileParams.inFileObject = this;
|
||
|
|
||
|
QTSS_Error theErr = QTSS_FileNotFound;
|
||
|
UInt32 x = 0;
|
||
|
|
||
|
for ( ; x < QTSServerInterface::GetNumModulesInRole(QTSSModule::kOpenFilePreProcessRole); x++)
|
||
|
{
|
||
|
theErr = QTSServerInterface::GetModule(QTSSModule::kOpenFilePreProcessRole, x)->CallDispatch(QTSS_OpenFilePreProcess_Role, &theParams);
|
||
|
if (theErr != QTSS_FileNotFound)
|
||
|
{
|
||
|
fModule = QTSServerInterface::GetModule(QTSSModule::kOpenFilePreProcessRole, x);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (theErr == QTSS_FileNotFound)
|
||
|
{
|
||
|
// None of the prepreprocessors claimed this file. Invoke the default file handler
|
||
|
if (QTSServerInterface::GetNumModulesInRole(QTSSModule::kOpenFileRole) > 0)
|
||
|
{
|
||
|
fModule = QTSServerInterface::GetModule(QTSSModule::kOpenFileRole, 0);
|
||
|
theErr = QTSServerInterface::GetModule(QTSSModule::kOpenFileRole, 0)->CallDispatch(QTSS_OpenFile_Role, &theParams);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Reset the curTask to what it was before this role started
|
||
|
if (theState != NULL)
|
||
|
theState->curTask = curTask;
|
||
|
|
||
|
return theErr;
|
||
|
}
|
||
|
|
||
|
void QTSSFile::Close()
|
||
|
{
|
||
|
Assert(fModule != NULL);
|
||
|
|
||
|
QTSS_RoleParams theParams;
|
||
|
theParams.closeFileParams.inFileObject = this;
|
||
|
(void)fModule->CallDispatch(QTSS_CloseFile_Role, &theParams);
|
||
|
}
|
||
|
|
||
|
|
||
|
QTSS_Error QTSSFile::Read(void* ioBuffer, UInt32 inBufLen, UInt32* outLengthRead)
|
||
|
{
|
||
|
Assert(fModule != NULL);
|
||
|
UInt32 theLenRead = 0;
|
||
|
|
||
|
//
|
||
|
// Invoke the owning QTSS API module. Setup a param block to do so.
|
||
|
QTSS_RoleParams theParams;
|
||
|
theParams.readFileParams.inFileObject = this;
|
||
|
theParams.readFileParams.inFilePosition = fPosition;
|
||
|
theParams.readFileParams.ioBuffer = ioBuffer;
|
||
|
theParams.readFileParams.inBufLen = inBufLen;
|
||
|
theParams.readFileParams.outLenRead = &theLenRead;
|
||
|
|
||
|
QTSS_Error theErr = fModule->CallDispatch(QTSS_ReadFile_Role, &theParams);
|
||
|
|
||
|
fPosition += theLenRead;
|
||
|
if (outLengthRead != NULL)
|
||
|
*outLengthRead = theLenRead;
|
||
|
|
||
|
return theErr;
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSSFile::Seek(UInt64 inNewPosition)
|
||
|
{
|
||
|
UInt64* theFileLength = NULL;
|
||
|
UInt32 theParamLength = 0;
|
||
|
|
||
|
(void)this->GetValuePtr(qtssFlObjLength, 0, (void**)&theFileLength, &theParamLength);
|
||
|
|
||
|
if (theParamLength != sizeof(UInt64))
|
||
|
return QTSS_RequestFailed;
|
||
|
|
||
|
if (inNewPosition > *theFileLength)
|
||
|
return QTSS_RequestFailed;
|
||
|
|
||
|
fPosition = inNewPosition;
|
||
|
return QTSS_NoErr;
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSSFile::Advise(UInt64 inPosition, UInt32 inAdviseSize)
|
||
|
{
|
||
|
Assert(fModule != NULL);
|
||
|
|
||
|
//
|
||
|
// Invoke the owning QTSS API module. Setup a param block to do so.
|
||
|
QTSS_RoleParams theParams;
|
||
|
theParams.adviseFileParams.inFileObject = this;
|
||
|
theParams.adviseFileParams.inPosition = inPosition;
|
||
|
theParams.adviseFileParams.inSize = inAdviseSize;
|
||
|
|
||
|
return fModule->CallDispatch(QTSS_AdviseFile_Role, &theParams);
|
||
|
}
|
||
|
|
||
|
QTSS_Error QTSSFile::RequestEvent(QTSS_EventType inEventMask)
|
||
|
{
|
||
|
Assert(fModule != NULL);
|
||
|
|
||
|
//
|
||
|
// Invoke the owning QTSS API module. Setup a param block to do so.
|
||
|
QTSS_RoleParams theParams;
|
||
|
theParams.reqEventFileParams.inFileObject = this;
|
||
|
theParams.reqEventFileParams.inEventMask = inEventMask;
|
||
|
|
||
|
return fModule->CallDispatch(QTSS_RequestEventFile_Role, &theParams);
|
||
|
}
|