Darwin-Streaming-Server/Server.tproj/QTSSFile.cpp

195 lines
6.7 KiB
C++
Raw Normal View History

/*
*
* @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);
}