📄 mvobjdb.cpp
字号:
return (NULL);
}
/* Check for valid movie object id */
if (ulMvObjID > (ULONG)hMvObj->usNumberOfMvObjs)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetTermInfo: Invalid movie object ID!\n"));
return (NULL);
}
return (&hMvObj->TermInfo[ulMvObjID]);
}
/**
* MvObjGetNumberOfNavCmds -- Get number of navigation commands in a movie object.
*
* @param
* ulMvObjID -- Movie Object ID
*
* @retval
* Pointer to the database field that contains the number of navigation
* commands in the specified movie object.
*/
USHORT* MvObjGetNumberOfNavCmds(ULONG ulMvObjID)
{
if (hMvObj == NULL)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetNumberOfNavCmds: Database not created!\n"));
return (NULL);
}
/* Check for valid movie object id */
if (ulMvObjID > (ULONG)hMvObj->usNumberOfMvObjs)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetNumberOfNavCmds: Invalid movie object ID!\n"));
return (NULL);
}
return (&hMvObj->usNumberOfNavCmds[ulMvObjID]);
}
/**
* MvObjGetNavCmds -- Get the navigation commands from a specified movie object
*
* @param
* ulMvObjID -- Movie Object ID
*
* @retval
* Pointer to the database field that contains the navigation commands
* of the specified movie object.
*/
MVOBJ_NAV_COMMAND* MvObjGetNavCmds(ULONG ulMvObjID)
{
if (hMvObj == NULL)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetNumberOfNavCmds: Database not created!\n"));
return (NULL);
}
/* Check for valid movie object id */
if (ulMvObjID > (ULONG)hMvObj->usNumberOfMvObjs)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetNumberOfNavCmds: Invalid movie object ID!\n"));
return (NULL);
}
return (hMvObj->NavCmd[ulMvObjID]);
}
/**
* mvobjLoadIndicator -- Load type indicator and version number from file.
*
* @param
* file -- file handle (could be main or backup)
*
* @retval
* MVOBJ_STATUS
*/
static MVOBJ_STATUS mvobjLoadIndicator(LOADER_FILE_HANDLE file)
{
MVOBJ_STATUS tStatus;
UBYTE ubData[8];
/* Read the type indicator and version number from the file */
if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 8, NULL) != LOADER_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadIndicator: Failed to read type indicator!\n"));
tStatus = MVOBJ_FILE_ERROR;
goto errout;
}
/* Check that type indicator is valid */
if ( (ubData[0] != 'M') || (ubData[1] != 'O') || (ubData[2] != 'B') || (ubData[3] != 'J') )
{
DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadIndicator: Invalid type indicator!\n"));
tStatus = MVOBJ_INVALID_FORMAT;
goto errout;
}
/* Check that version number is valid */
if (GET_INT_FROM_ASCII4( (&ubData[4]) ) < BDROM_SPEC_VERSION)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadIndicator: Version Number Invalid!\n"));
tStatus = MVOBJ_INVALID_FORMAT;
goto errout;
}
return (MVOBJ_SUCCESS);
errout:
return (tStatus);
}
/**
* mvobjLoadMobjs -- Load movie objects from file.
*
* @param
* file -- file handle (could be main or backup)
*
* @retval
* MVOBJ_STATUS
*/
static MVOBJ_STATUS mvobjLoadMobjs(LOADER_FILE_HANDLE file)
{
MVOBJ_STATUS tStatus;
UBYTE ubData[16];
ULONG ulLength;
USHORT i;
/* Seek To the MovieObjects() */
if (LoaderFileSeek(hMvObj->hLoader, file, LOADER_SEEK_SET, 40) != LOADER_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobjs: Failed to seek in file!\n"));
tStatus = MVOBJ_FILE_ERROR;
goto errout;
}
/* Read the length, reserved data, and number of movie objects from the file */
if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 10, NULL) != LOADER_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: Failed to read number of mobjs!\n"));
tStatus = MVOBJ_FILE_ERROR;
goto errout;
}
/* Set the length */
ulLength = MAKE_DWORD(&ubData[0]);
/* Set number of movie objects */
hMvObj->usNumberOfMvObjs = MAKE_WORD(&ubData[8]);
/* Read each movie object from the file */
for (i = 0; i < hMvObj->usNumberOfMvObjs; i++)
{
/* Load movie object's terminal information */
tStatus = mvobjLoadMobj_TermInfo(file, &hMvObj->TermInfo[i]);
if (tStatus != MVOBJ_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: mobj_id = %d, failed to load terminfo!\n", i));
goto errout;
}
/* Load movie object's navigation commands */
tStatus = mvobjLoadMobj_NavCmds(file, &hMvObj->NavCmd[i], &hMvObj->usNumberOfNavCmds[i]);
if (tStatus != MVOBJ_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: mobj_id = %d, failed to load navcmds!\n", i));
goto errout;
}
}
return (MVOBJ_SUCCESS);
errout:
return (tStatus);
}
/**
* mvobjLoadMobj_TermInfo -- Load movie object terminal info.
*
* @param
* file -- file handle (could be main or backup)
* pTermInfo -- pointer to terminal information
*
* @retval
* MVOBJ_STATUS
*/
static MVOBJ_STATUS mvobjLoadMobj_TermInfo(LOADER_FILE_HANDLE file, MVOBJ_TERMINFO *pTermInfo)
{
MVOBJ_STATUS tStatus;
UBYTE ubData[8];
/* Read the terminal info from the file */
if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 2, NULL) != LOADER_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobj_TermInfo: Failed to read terminal info!\n"));
tStatus = MVOBJ_FILE_ERROR;
goto errout;
}
/* Check resume intention flag in terminal info */
if ( (ubData[0] & 0x80) != 0)
{
/* Resume Intention flag is set */
pTermInfo->fResumeIntentionFlag = TRUE;
}
else
{
/* Resume Intention flag is not set */
pTermInfo->fResumeIntentionFlag = FALSE;
}
/* Check menu call mask in terminal info */
if ( (ubData[0] & 0x40) != 0)
{
/* Menu call mask is set */
pTermInfo->fMenuCallMask = TRUE;
}
else
{
/* Menu call mask is not set */
pTermInfo->fMenuCallMask = FALSE;
}
/* Check title call mask in terminal info */
if ( (ubData[0] & 0x20) != 0)
{
/* Title call mask is set */
pTermInfo->fTitleSearchMask = TRUE;
}
else
{
/* Title call mask is not set */
pTermInfo->fTitleSearchMask = FALSE;
}
return (MVOBJ_SUCCESS);
errout:
return (tStatus);
}
/**
* mvobjLoadMobj_NavCmds -- Load movie object navigation commands.
*
* @param
* file -- file handle (could be main or backup)
* pNavCmds -- pointer to navigation commands
* pusNumberNavCmds -- pointer to number of navigation commands
*
* @retval
* MVOBJ_STATUS
*/
static MVOBJ_STATUS mvobjLoadMobj_NavCmds(LOADER_FILE_HANDLE file, MVOBJ_NAV_COMMAND **pNavCmds, USHORT *pusNumberNavCmds)
{
MVOBJ_STATUS tStatus;
UBYTE ubData[16];
USHORT i;
/* Read the number of navigation commands from the file */
if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 2, NULL) != LOADER_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobj_NavCmds: Failed to number of navigation commands!\n"));
tStatus = MVOBJ_FILE_ERROR;
goto errout;
}
/* Set number of navigation commands */
*pusNumberNavCmds = MAKE_WORD(&ubData[0]);
if (*pusNumberNavCmds != 0 )
{
/* Allocate memory for navigation commands */
*pNavCmds = (MVOBJ_NAV_COMMAND *)OS_MemAlloc(sizeof(MVOBJ_NAV_COMMAND) * (*pusNumberNavCmds) );
if (*pNavCmds == NULL)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobj_NavCmds: Failed to allocate memory!\n"));
tStatus = MVOBJ_FAILURE;
goto errout;
}
/* Read all navigation commands from movie object */
for (i = 0; i < *pusNumberNavCmds; i++)
{
/* Read navigation command from the file */
if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 12, NULL) != LOADER_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobj_NavCmds: Failed to read navigation command!\n"));
tStatus = MVOBJ_FILE_ERROR;
goto errout;
}
else
{
/* Set Navigation command */
(*pNavCmds)[i].ulOpCode = MAKE_DWORD(&ubData[0]);
(*pNavCmds)[i].ulDstOperand = MAKE_DWORD(&ubData[4]);
(*pNavCmds)[i].ulSrcOperand = MAKE_DWORD(&ubData[8]);
}
}
}
return (MVOBJ_SUCCESS);
errout:
if (*pNavCmds != NULL)
{
OS_MemFree(*pNavCmds);
*pNavCmds = NULL;
}
return (tStatus);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -