| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- #include "BurnCore.h"
- /* for the settings */
- //----------------------------------------------------------
- EXITCODE CWriteToDVD::SetCDParam(CDPARAM *cdParam){
- if(!cdParam||cdParam->szBurnMethod!=0)
- return EXITCODE_BAD_USAGE;
- //get
- this->m_cdtitle=cdParam->szTitle;
- this->m_cd_type=cdParam->szCDType;
- this->m_IsEject=cdParam->IsEject;
- //check dvd-w
- NERO_SCSI_DEVICE_INFOS *NeroDeviceInfos=0;
- DWORD m_set= MEDIA_NONE;//|MEDIA_CD|MEDIA_DVD_ANY;
- __try{
- NeroDeviceInfos = NeroGetAvailableDrivesEx ((NERO_MEDIA_TYPE)m_set,NULL);
- if (!NeroDeviceInfos) {
- LogError("NeroGetAvailableDrives()");
- return EXITCODE_NO_SUPPORT_FOR_CDRW;
- }
- for (int i = 0; i < NeroDeviceInfos->nsdisNumDevInfos; i++)
- {
- char driveLetter=NeroDeviceInfos->nsdisDevInfos[i].nsdiDriveLetter ? NeroDeviceInfos->nsdisDevInfos[i].nsdiDriveLetter : '?';
- if (toupper(cdParam->szDriver)==toupper(driveLetter))
- {
- this->m_handle = NeroOpenDevice (&NeroDeviceInfos->nsdisDevInfos[i]);
- if (!this->m_handle)
- {
- LogError("can not open dirver");
- return EXITCODE_ERROR_OPENNING_DRIVE;
- }
- break;
- }
- }
- return (this->m_handle!=0)?EXITCODE_OK:EXITCODE_DRIVE_NOT_FOUND;
- }__finally{
- if(NeroDeviceInfos)NeroFreeMem (NeroDeviceInfos);
- }
- }
- //------------------------------------------------------------
- NERO_CD_INFO * CWriteToDVD::GetCDParam(){
- if(!this->m_handle){
- LogError("handle=0!Open dirver first");
- return NULL;
- }
- NERO_CD_INFO *NeroCDInfo=0;
- NeroCDInfo = NeroGetCDInfo(this->m_handle, NGCDI_READ_CD_TEXT|NGCDI_READ_ISRC);
- if (!NeroCDInfo) {
- LogError ("NeroGetCDInfo()");
- return NULL;
- }
- return NeroCDInfo;
- }
- //------------------------------------------------------------
- EXITCODE CWriteToDVD::BurnData(const CFileList *listRecData){
- int size = sizeof (NERO_WRITE_CD) ;
- NERO_WRITE_CD *pWriteCD = (NERO_WRITE_CD *)malloc (size);
- NERO_ISO_ITEM * pItem = NULL;
- EXITCODE code =EXITCODE_OK;
- if (!pWriteCD) {
- return EXITCODE_OUT_OF_MEMORY;
- }
- memset (pWriteCD, 0, size);
- pWriteCD->nwcdMediaType = this->m_cd_type ? MEDIA_DVD_ANY : MEDIA_CD;
- pWriteCD->nwcdNumTracks = 0;
- pWriteCD->nwcdpCDStamp=NULL;
- pWriteCD->nwcdArtist=NULL;
- pWriteCD->nwcdTitle=this->m_cdtitle.c_str();
- //NeroEjectLoadCD(this->m_handle,true);
- try{
- code = GetIsoTrack (this->m_cdtitle, listRecData,&pWriteCD->nwcdIsoTrack, &pItem);
- if (code != EXITCODE_OK)
- {
- throw code;
- }
- CBurnContextProgress m_NeroProgress;
- DWORD b_flag=NBF_WRITE
- | (this->m_IsEject ? 0:NBF_DISABLE_EJECT)
- |NBF_DETECT_NON_EMPTY_CDRW;
- int res = NeroBurn (this->m_handle,NERO_ISO_AUDIO_MEDIA ,pWriteCD,
- b_flag,0, m_NeroProgress);
- if(pWriteCD)
- {
- delete [] (char *)pWriteCD;
- pWriteCD = NULL;
- }
- if(res!=NEROAPI_BURN_OK){
- switch(res)
- {
- case NEROAPI_BURN_UNKNOWN_CD_FORMAT:
- LogError ("BurnCD() : unknown CD format");
- throw EXITCODE_UNKNOWN_CD_FORMAT;
- case NEROAPI_BURN_INVALID_DRIVE:
- LogError ("BurnCD() : invalid drive");
- throw EXITCODE_INVALID_DRIVE;
- case NEROAPI_BURN_FAILED:
- LogError ("BurnCD() : burn failed");
- throw EXITCODE_BURN_FAILED;
- case NEROAPI_BURN_FUNCTION_NOT_ALLOWED:
- LogError ("BurnCD() : function not allowed");
- throw EXITCODE_FUNCTION_NOT_ALLOWED;
- case NEROAPI_BURN_DRIVE_NOT_ALLOWED:
- LogError ("BurnCD() : drive not allowed");
- throw EXITCODE_DRIVE_NOT_ALLOWED;
- case NEROAPI_BURN_USER_ABORT:
- LogError ("BurnCD() : aborted by the user");
- throw EXITCODE_USER_ABORTED;
- default:
- LogError ("BurnCD() : unknown error");
- throw EXITCODE_UNKNOWN;
- }
- }
-
- }
- catch(EXITCODE e)
- {
- code =e;
- }
- if(pWriteCD && pWriteCD->nwcdIsoTrack)
- {
- NeroFreeIsoTrack (pWriteCD->nwcdIsoTrack);
- pWriteCD->nwcdIsoTrack = NULL;
- }
- if(pItem)
- {
- DeleteIsoItemTree (pItem);
- pItem = NULL;
- }
- return code;
- }
- //------------------------------------------------------------
- EXITCODE CWriteToDVD::InitNero(){
- this->m_log=fopen(".\\Burndvd_log.txt","wt");
- if(this->m_log==NULL)return EXITCODE_ERROR_OPEN_LOGFILE;
- //init
- if (!NeroAPIGlueConnect(NULL))return EXITCODE_NEROAPI_DLL_NOT_FOUND;
- //prepare settings
- /*NERO_SETTINGS nsSettings;
- string path="NeroFiles";
- string vendor="ahead";
- string pcsoft="Nero - Burning Rom";
- string language="Nero.txt";*/
- //nsSettings.nstNeroFilesPath = path.c_str();
- //nsSettings.nstVendor = vendor.c_str();
- //// set pointers to various callback functions
- ////nsSettings.nstIdle.ncCallbackFunction = IdleCallback;
- //// this pointer is required to access non-static variables from callback functions
- //nsSettings.nstIdle.ncUserData = this;
- //nsSettings.nstSoftware = pcsoft.c_str();
- //nsSettings.nstUserDialog.ncUserData = this;
- ////nsSettings.nstUserDialog.ncCallbackFunction = UserDialog;
- //nsSettings.nstLanguageFile =language.c_str();
- /*npProgress.npAbortedCallback = AbortedCallback;
- npProgress.npAddLogLineCallback = NULL;
- npProgress.npDisableAbortCallback = NULL;
- npProgress.npProgressCallback = NULL;
- npProgress.npSetPhaseCallback = NULL;
- npProgress.npUserData = &nsSettings;
- npProgress.npSetMajorPhaseCallback=NULL;
- npProgress.npSubTaskProgressCallback=NULL;*/
- s_NeroSettings.nstUserDialog.ncCallbackFunction = UserDialog;
- s_NeroSettings.nstUserDialog.ncUserData = this;
- NEROAPI_INIT_ERROR initErr=NeroInit (&s_NeroSettings,NULL);
- if(initErr!=NEROAPI_INIT_OK){
- switch (initErr)
- {
- case NEROAPI_INIT_INVALID_ARGS:
- LogError ("NeroInit() : invalid args");
- break;
- case NEROAPI_INIT_INVALID_SERIAL_NUM:
- LogError ("NeroInit() : invalid serial number");
- break;
- case NEROAPI_INIT_DEMOVERSION_EXPIRED:
- LogError ("NeroInit() : demo version has expired");
- break;
- case NEROAPI_INIT_CANNOT_LOCK:
- LogError ("NeroInit() : cannot lock");
- break;
- default:
- case NEROAPI_INIT_UNSPECIFIED_ERROR:
- LogError ("NeroInit() : unspecified error");
- }
- return EXITCODE_INTERNAL_ERROR;
- }
- return EXITCODE_OK;
- }
- //------------------------------------------------------------
- CWriteToDVD::~CWriteToDVD(){
- fclose(m_log);
- if(this->m_handle)
- NeroCloseDevice (this->m_handle);
- NeroClearErrors ();
- NeroDone ();
- NeroAPIGlueDone();
- }
- //------------------------------------------------------------
- void CWriteToDVD::LogError(char *action){
- char *error = NeroGetLastError ();
- fprintf(this->m_log,"%s",action);
- fprintf(this->m_log,"%s" ,(error ? error : "failed"));
- NeroFreeMem (error);
- fflush(m_log);
- }
- //------------------------------------------------------------
- int CWriteToDVD::LogError(const char * format, ...)
- {
- va_list args;
- va_start (args, format);
- int ret;
- if (NULL != this->m_log)
- {
- ret=vfprintf (this->m_log, format, args);
- }
- va_end (args);
- return ret;
- }
|