Develop and Download Open Source Software

Browse CVS Repository

Contents of /enbanfukusyaya/EnbanFukusyaYa/DriveAccess/emg.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.5 - (show annotations) (download) (as text)
Fri Nov 5 17:24:03 2010 UTC (13 years, 5 months ago) by bananajinn
Branch: MAIN
CVS Tags: HEAD
Changes since 1.4: +35 -35 lines
File MIME type: text/x-csrc
*** empty log message ***

1 /**
2 * @file emg.c
3 * @brief 円盤複写屋イメージ読み書き
4 * @author BananaJinn
5 * @version $Id: emg.c,v 1.4 2007/01/30 15:49:27 bananajinn Exp $
6 * 円盤複写屋
7 * Copyright (C) 2004-2006 BananaJinn<banana@mxh.mesh.ne.jp>.
8 */
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdlib.h>
12
13 #include "mem.h"
14 #include "aspi.h"
15 #include "struct.h"
16 #include "cmd.h"
17 #include "drive.h"
18 #include "text.h"
19 #include "log.h"
20 #include "ui.h"
21 #include "discinfo.h"
22 #include "emg.h"
23
24 /**
25 * @brief 円盤複写屋イメージのトラック情報
26 */
27 typedef struct {
28 BYTE mark[4]; /**< "ETRK" */
29 struct _TRACKINFO trackinfo; /**< ドライブから読み出したトラック情報 */
30 BYTE mode2; /**< mode2かどうか */
31 BYTE isrc[12+1]; /**< ISRC */
32 BYTE tao; /**< TAOかどうか */
33 BYTE pause_len[2]; /**< AUDIO PAUSE LENGTH */
34 } EMG_TRACKINFO;
35
36 /**
37 * @brief 円盤複写屋イメージのディスク情報
38 */
39 typedef struct {
40 BYTE mark[4]; /**< "EDSC" */
41 BYTE disc_type; /**< ディスク種別 */
42 BYTE disc_stat; /**< ディスクステータス */
43 BYTE last_sess_stat; /**< 最終セッションステータス */
44 BYTE mcn[13+1]; /**< メディアカタログ番号 */
45 BYTE last_addr[4]; /**< 最終アドレス(LBA) */
46 BYTE sessions[2]; /**< セッション数 */
47 BYTE tracks[2]; /**< トラック数 */
48 BYTE cdtext_size[4]; /**< CD-TEXTサイズ(バイト数) */
49 } EMG_DISCINFO;
50
51 #define EMGMARK_SIZE 4
52
53 #define EMGMARK_DISCINFO ((BYTE *)"EDSC")
54 #define EMGMARK_CDTEXT ((BYTE *)"ECDT")
55 #define EMGMARK_TRACKINFO ((BYTE *)"ETRK")
56 #define EMGMARK_DATA ((BYTE *)"EDTA")
57
58 /**
59 * @brief 円盤複写屋イメージ形式でディスク情報をファイルに書き込み
60 * @param[in] image イメージファイル
61 * @param[in] discinfo 書き込むディスク情報
62 * @retval RET_OK 正常終了
63 * @retval RET_NG エラー
64 */
65 int EmgWriteDiscInformation(IMAGEFILE *image, CPDISCINFO *discinfo)
66 {
67 union {
68 EMG_DISCINFO disc;
69 EMG_TRACKINFO track;
70 } buf;
71 EMG_DISCINFO *emg_disc = &buf.disc;
72 EMG_TRACKINFO *emg_track = &buf.track;
73 int ret;
74 WORD track;
75 BYTE version[4];
76 CPTRACKINFO *trackinfo;
77
78 Set4bytes(version, EMGFILE_VERSION);
79 ret = WriteImageFile(image, &version, sizeof(version), TRUE);
80 if(ret!=RET_OK){
81 return ret;
82 }
83
84 memset(emg_disc, 0, sizeof(EMG_DISCINFO));
85 memcpy(emg_disc->mark, EMGMARK_DISCINFO, EMGMARK_SIZE);
86 emg_disc->disc_type = discinfo->disc_type;
87 emg_disc->disc_stat = discinfo->disc_stat;
88 emg_disc->last_sess_stat = discinfo->last_sess_stat;
89 memcpy(emg_disc->mcn, discinfo->media_catalog_number,
90 sizeof(emg_disc->mcn));
91 Set4bytes(emg_disc->last_addr, discinfo->last_addr);
92 Set2bytes(emg_disc->sessions, discinfo->sessions);
93 Set2bytes(emg_disc->tracks, discinfo->tracks);
94 Set4bytes(emg_disc->cdtext_size, discinfo->cdtext_size);
95 ret = WriteImageFile(image, emg_disc, sizeof(EMG_DISCINFO), TRUE);
96 if(ret!=RET_OK){
97 return ret;
98 }
99
100 if(discinfo->cdtext_size > 0){
101 ret = WriteImageFile(image, EMGMARK_CDTEXT, EMGMARK_SIZE, TRUE);
102 if(ret!=RET_OK){
103 return ret;
104 }
105 ret = WriteImageFile(image, discinfo->cdtext, discinfo->cdtext_size, TRUE);
106 if(ret!=RET_OK){
107 return ret;
108 }
109 }
110
111 for(track=0; track<discinfo->tracks; track++){
112 trackinfo = &discinfo->trackinfo[track];
113 memset(emg_track, 0, sizeof(EMG_TRACKINFO));
114 memcpy(emg_track->mark, EMGMARK_TRACKINFO, EMGMARK_SIZE);
115 memcpy(&emg_track->trackinfo, &trackinfo->trackinfo,
116 sizeof(struct _TRACKINFO));
117 emg_track->mode2 = trackinfo->mode2;
118 memcpy(emg_track->isrc, trackinfo->isrc, sizeof(emg_track->isrc));
119 emg_track->tao = (BYTE)(trackinfo->tao ? 1:0);
120 Set2bytes(emg_track->pause_len, trackinfo->pause_len);
121 ret = WriteImageFile(image, emg_track, sizeof(EMG_TRACKINFO), TRUE);
122 if(ret!=RET_OK){
123 return ret;
124 }
125 }
126
127 ret = WriteImageFile(image, EMGMARK_DATA, EMGMARK_SIZE, TRUE);
128 if(ret!=RET_OK){
129 return ret;
130 }
131
132 return RET_OK;
133 }
134
135
136 /**
137 * @brief イメージファイルから4バイト読み取り、マークを確認する
138 * @param[in] image イメージファイル
139 * @param[in] mark マーク4バイト
140 * @retval RET_OK 確認OK
141 * @retval RET_NG 確認NG
142 */
143 static int EmgCheckMark(IMAGEFILE *image, BYTE *mark)
144 {
145 int ret;
146 BYTE buf[EMGMARK_SIZE];
147
148 ret = ReadImageFile(image, buf, sizeof(buf), TRUE);
149 if(ret!=RET_OK){
150 return ret;
151 }
152 if(memcmp(buf, mark, sizeof(buf))){
153 UIDispMessage(MSG_INVALID_IMAGE_FILE
154 /*"不正なイメージファイルです。"*/, UIDMT_ERROR);
155 return RET_NG;
156 }
157 return RET_OK;
158 }
159
160
161 /**
162 * @brief 円盤複写屋イメージ形式でディスク情報をファイルから読み込み
163 * @param[in] image イメージファイル
164 * @param[out] discinfo 書き込むディスク情報
165 * @retval RET_OK 正常終了
166 * @retval RET_NG エラー
167 */
168 int EmgReadDiscInformation(IMAGEFILE *image, CPDISCINFO *discinfo)
169 {
170 union {
171 EMG_DISCINFO disc;
172 EMG_TRACKINFO track;
173 } buf;
174 EMG_DISCINFO *emg_disc = &buf.disc;
175 EMG_TRACKINFO *emg_track = &buf.track;
176 int ret;
177 WORD track;
178 BYTE version[4];
179 CPTRACKINFO *trackinfo;
180
181 ret = ReadImageFile(image, version, sizeof(version), TRUE);
182 if(ret!=RET_OK){
183 return ret;
184 }
185 if(Get4bytes(version) != EMGFILE_VERSION){
186 UIDispMessage(MSG_INVALID_IMAGE_FILE
187 /*"不正なイメージファイルです。"*/, UIDMT_ERROR);
188 return RET_NG;
189 }
190
191 ret = ReadImageFile(image, emg_disc, sizeof(EMG_DISCINFO), TRUE);
192 if(ret!=RET_OK){
193 return ret;
194 }
195 if(memcmp(emg_disc->mark, EMGMARK_DISCINFO, EMGMARK_SIZE)){
196 UIDispMessage(MSG_INVALID_IMAGE_FILE
197 /*"不正なイメージファイルです。"*/, UIDMT_ERROR);
198 return RET_NG;
199 }
200 memset(discinfo, 0, sizeof(CPDISCINFO));
201 discinfo->disc_type = emg_disc->disc_type;
202 discinfo->disc_stat = emg_disc->disc_stat;
203 discinfo->last_sess_stat = emg_disc->last_sess_stat;
204 memcpy(discinfo->media_catalog_number, emg_disc->mcn,
205 sizeof(discinfo->media_catalog_number));
206 discinfo->last_addr = Get4bytes(emg_disc->last_addr);
207 discinfo->sessions = Get2bytes(emg_disc->sessions);
208 discinfo->tracks = Get2bytes(emg_disc->tracks);
209 discinfo->cdtext_size = Get4bytes(emg_disc->cdtext_size);
210
211 if(discinfo->cdtext_size > 0){
212 ret = EmgCheckMark(image, EMGMARK_CDTEXT);
213 if(ret!=RET_OK){
214 return ret;
215 }
216 discinfo->cdtext = MemNew(discinfo->cdtext_size);
217 if(discinfo->cdtext == NULL){
218 return RET_MEMERR;
219 }
220 ret = ReadImageFile(image, discinfo->cdtext, discinfo->cdtext_size,
221 TRUE);
222 if(ret!=RET_OK){
223 MemFree(discinfo->cdtext);
224 discinfo->cdtext = NULL;
225 return ret;
226 }
227 }
228
229 discinfo->trackinfo = MemNew(sizeof(CPTRACKINFO)*discinfo->tracks);
230 if(discinfo->trackinfo == NULL){
231 MemFree(discinfo->cdtext);
232 discinfo->cdtext = NULL;
233 return RET_MEMERR;
234 }
235 memset(discinfo->trackinfo, 0, sizeof(CPTRACKINFO)*discinfo->tracks);
236 for(track=0; track<discinfo->tracks; track++){
237 trackinfo = &discinfo->trackinfo[track];
238 ret = ReadImageFile(image, emg_track, sizeof(EMG_TRACKINFO), TRUE);
239 if(ret!=RET_OK){
240 MemFree(discinfo->trackinfo);
241 discinfo->trackinfo = NULL;
242 MemFree(discinfo->cdtext);
243 discinfo->cdtext = NULL;
244 return ret;
245 }
246 if(memcmp(emg_track->mark, EMGMARK_TRACKINFO, EMGMARK_SIZE)){
247 MemFree(discinfo->trackinfo);
248 discinfo->trackinfo = NULL;
249 MemFree(discinfo->cdtext);
250 discinfo->cdtext = NULL;
251 UIDispMessage(MSG_INVALID_IMAGE_FILE
252 /*"不正なイメージファイルです。"*/, UIDMT_ERROR);
253 return RET_NG;
254 }
255 memcpy(&trackinfo->trackinfo, &emg_track->trackinfo,
256 sizeof(struct _TRACKINFO));
257 trackinfo->mode2 = emg_track->mode2;
258 memcpy(trackinfo->isrc, emg_track->isrc, sizeof(trackinfo->isrc));
259 trackinfo->tao = emg_track->tao != 0;
260 trackinfo->pause_len = Get2bytes(emg_track->pause_len);
261 }
262
263 ret = EmgCheckMark(image, EMGMARK_DATA);
264 if(ret!=RET_OK){
265 MemFree(discinfo->trackinfo);
266 discinfo->trackinfo = NULL;
267 MemFree(discinfo->cdtext);
268 discinfo->cdtext = NULL;
269 return ret;
270 }
271
272 return RET_OK;
273 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26