BurnCore.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. #include "BurnCore.h"
  2. /* for the settings */
  3. //----------------------------------------------------------
  4. EXITCODE CWriteToDVD::SetCDParam(CDPARAM *cdParam){
  5. if(!cdParam||cdParam->szBurnMethod!=0)
  6. return EXITCODE_BAD_USAGE;
  7. //get
  8. this->m_cdtitle=cdParam->szTitle;
  9. this->m_cd_type=cdParam->szCDType;
  10. this->m_IsEject=cdParam->IsEject;
  11. //check dvd-w
  12. NERO_SCSI_DEVICE_INFOS *NeroDeviceInfos=0;
  13. DWORD m_set= MEDIA_NONE;//|MEDIA_CD|MEDIA_DVD_ANY;
  14. __try{
  15. NeroDeviceInfos = NeroGetAvailableDrivesEx ((NERO_MEDIA_TYPE)m_set,NULL);
  16. if (!NeroDeviceInfos) {
  17. LogError("NeroGetAvailableDrives()");
  18. return EXITCODE_NO_SUPPORT_FOR_CDRW;
  19. }
  20. for (int i = 0; i < NeroDeviceInfos->nsdisNumDevInfos; i++)
  21. {
  22. char driveLetter=NeroDeviceInfos->nsdisDevInfos[i].nsdiDriveLetter ? NeroDeviceInfos->nsdisDevInfos[i].nsdiDriveLetter : '?';
  23. if (toupper(cdParam->szDriver)==toupper(driveLetter))
  24. {
  25. this->m_handle = NeroOpenDevice (&NeroDeviceInfos->nsdisDevInfos[i]);
  26. if (!this->m_handle)
  27. {
  28. LogError("can not open dirver");
  29. return EXITCODE_ERROR_OPENNING_DRIVE;
  30. }
  31. break;
  32. }
  33. }
  34. return (this->m_handle!=0)?EXITCODE_OK:EXITCODE_DRIVE_NOT_FOUND;
  35. }__finally{
  36. if(NeroDeviceInfos)NeroFreeMem (NeroDeviceInfos);
  37. }
  38. }
  39. //------------------------------------------------------------
  40. NERO_CD_INFO * CWriteToDVD::GetCDParam(){
  41. if(!this->m_handle){
  42. LogError("handle=0!Open dirver first");
  43. return NULL;
  44. }
  45. NERO_CD_INFO *NeroCDInfo=0;
  46. NeroCDInfo = NeroGetCDInfo(this->m_handle, NGCDI_READ_CD_TEXT|NGCDI_READ_ISRC);
  47. if (!NeroCDInfo) {
  48. LogError ("NeroGetCDInfo()");
  49. return NULL;
  50. }
  51. return NeroCDInfo;
  52. }
  53. //------------------------------------------------------------
  54. EXITCODE CWriteToDVD::BurnData(const CFileList *listRecData){
  55. int size = sizeof (NERO_WRITE_CD) ;
  56. NERO_WRITE_CD *pWriteCD = (NERO_WRITE_CD *)malloc (size);
  57. NERO_ISO_ITEM * pItem = NULL;
  58. EXITCODE code =EXITCODE_OK;
  59. if (!pWriteCD) {
  60. return EXITCODE_OUT_OF_MEMORY;
  61. }
  62. memset (pWriteCD, 0, size);
  63. pWriteCD->nwcdMediaType = this->m_cd_type ? MEDIA_DVD_ANY : MEDIA_CD;
  64. pWriteCD->nwcdNumTracks = 0;
  65. pWriteCD->nwcdpCDStamp=NULL;
  66. pWriteCD->nwcdArtist=NULL;
  67. pWriteCD->nwcdTitle=this->m_cdtitle.c_str();
  68. //NeroEjectLoadCD(this->m_handle,true);
  69. try{
  70. code = GetIsoTrack (this->m_cdtitle, listRecData,&pWriteCD->nwcdIsoTrack, &pItem);
  71. if (code != EXITCODE_OK)
  72. {
  73. throw code;
  74. }
  75. CBurnContextProgress m_NeroProgress;
  76. DWORD b_flag=NBF_WRITE
  77. | (this->m_IsEject ? 0:NBF_DISABLE_EJECT)
  78. |NBF_DETECT_NON_EMPTY_CDRW;
  79. int res = NeroBurn (this->m_handle,NERO_ISO_AUDIO_MEDIA ,pWriteCD,
  80. b_flag,0, m_NeroProgress);
  81. if(pWriteCD)
  82. {
  83. delete [] (char *)pWriteCD;
  84. pWriteCD = NULL;
  85. }
  86. if(res!=NEROAPI_BURN_OK){
  87. switch(res)
  88. {
  89. case NEROAPI_BURN_UNKNOWN_CD_FORMAT:
  90. LogError ("BurnCD() : unknown CD format");
  91. throw EXITCODE_UNKNOWN_CD_FORMAT;
  92. case NEROAPI_BURN_INVALID_DRIVE:
  93. LogError ("BurnCD() : invalid drive");
  94. throw EXITCODE_INVALID_DRIVE;
  95. case NEROAPI_BURN_FAILED:
  96. LogError ("BurnCD() : burn failed");
  97. throw EXITCODE_BURN_FAILED;
  98. case NEROAPI_BURN_FUNCTION_NOT_ALLOWED:
  99. LogError ("BurnCD() : function not allowed");
  100. throw EXITCODE_FUNCTION_NOT_ALLOWED;
  101. case NEROAPI_BURN_DRIVE_NOT_ALLOWED:
  102. LogError ("BurnCD() : drive not allowed");
  103. throw EXITCODE_DRIVE_NOT_ALLOWED;
  104. case NEROAPI_BURN_USER_ABORT:
  105. LogError ("BurnCD() : aborted by the user");
  106. throw EXITCODE_USER_ABORTED;
  107. default:
  108. LogError ("BurnCD() : unknown error");
  109. throw EXITCODE_UNKNOWN;
  110. }
  111. }
  112. }
  113. catch(EXITCODE e)
  114. {
  115. code =e;
  116. }
  117. if(pWriteCD && pWriteCD->nwcdIsoTrack)
  118. {
  119. NeroFreeIsoTrack (pWriteCD->nwcdIsoTrack);
  120. pWriteCD->nwcdIsoTrack = NULL;
  121. }
  122. if(pItem)
  123. {
  124. DeleteIsoItemTree (pItem);
  125. pItem = NULL;
  126. }
  127. return code;
  128. }
  129. //------------------------------------------------------------
  130. EXITCODE CWriteToDVD::InitNero(){
  131. this->m_log=fopen(".\\Burndvd_log.txt","wt");
  132. if(this->m_log==NULL)return EXITCODE_ERROR_OPEN_LOGFILE;
  133. //init
  134. if (!NeroAPIGlueConnect(NULL))return EXITCODE_NEROAPI_DLL_NOT_FOUND;
  135. //prepare settings
  136. /*NERO_SETTINGS nsSettings;
  137. string path="NeroFiles";
  138. string vendor="ahead";
  139. string pcsoft="Nero - Burning Rom";
  140. string language="Nero.txt";*/
  141. //nsSettings.nstNeroFilesPath = path.c_str();
  142. //nsSettings.nstVendor = vendor.c_str();
  143. //// set pointers to various callback functions
  144. ////nsSettings.nstIdle.ncCallbackFunction = IdleCallback;
  145. //// this pointer is required to access non-static variables from callback functions
  146. //nsSettings.nstIdle.ncUserData = this;
  147. //nsSettings.nstSoftware = pcsoft.c_str();
  148. //nsSettings.nstUserDialog.ncUserData = this;
  149. ////nsSettings.nstUserDialog.ncCallbackFunction = UserDialog;
  150. //nsSettings.nstLanguageFile =language.c_str();
  151. /*npProgress.npAbortedCallback = AbortedCallback;
  152. npProgress.npAddLogLineCallback = NULL;
  153. npProgress.npDisableAbortCallback = NULL;
  154. npProgress.npProgressCallback = NULL;
  155. npProgress.npSetPhaseCallback = NULL;
  156. npProgress.npUserData = &nsSettings;
  157. npProgress.npSetMajorPhaseCallback=NULL;
  158. npProgress.npSubTaskProgressCallback=NULL;*/
  159. s_NeroSettings.nstUserDialog.ncCallbackFunction = UserDialog;
  160. s_NeroSettings.nstUserDialog.ncUserData = this;
  161. NEROAPI_INIT_ERROR initErr=NeroInit (&s_NeroSettings,NULL);
  162. if(initErr!=NEROAPI_INIT_OK){
  163. switch (initErr)
  164. {
  165. case NEROAPI_INIT_INVALID_ARGS:
  166. LogError ("NeroInit() : invalid args");
  167. break;
  168. case NEROAPI_INIT_INVALID_SERIAL_NUM:
  169. LogError ("NeroInit() : invalid serial number");
  170. break;
  171. case NEROAPI_INIT_DEMOVERSION_EXPIRED:
  172. LogError ("NeroInit() : demo version has expired");
  173. break;
  174. case NEROAPI_INIT_CANNOT_LOCK:
  175. LogError ("NeroInit() : cannot lock");
  176. break;
  177. default:
  178. case NEROAPI_INIT_UNSPECIFIED_ERROR:
  179. LogError ("NeroInit() : unspecified error");
  180. }
  181. return EXITCODE_INTERNAL_ERROR;
  182. }
  183. return EXITCODE_OK;
  184. }
  185. //------------------------------------------------------------
  186. CWriteToDVD::~CWriteToDVD(){
  187. fclose(m_log);
  188. if(this->m_handle)
  189. NeroCloseDevice (this->m_handle);
  190. NeroClearErrors ();
  191. NeroDone ();
  192. NeroAPIGlueDone();
  193. }
  194. //------------------------------------------------------------
  195. void CWriteToDVD::LogError(char *action){
  196. char *error = NeroGetLastError ();
  197. fprintf(this->m_log,"%s",action);
  198. fprintf(this->m_log,"%s" ,(error ? error : "failed"));
  199. NeroFreeMem (error);
  200. fflush(m_log);
  201. }
  202. //------------------------------------------------------------
  203. int CWriteToDVD::LogError(const char * format, ...)
  204. {
  205. va_list args;
  206. va_start (args, format);
  207. int ret;
  208. if (NULL != this->m_log)
  209. {
  210. ret=vfprintf (this->m_log, format, args);
  211. }
  212. va_end (args);
  213. return ret;
  214. }