New API call burn_session_set_start_tno()
This commit is contained in:
parent
775eb175b6
commit
18efcd6299
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2012.01.06.125849"
|
#define Cdrskin_timestamP "2012.01.07.190901"
|
||||||
|
@ -340,7 +340,7 @@ int burn_drive_send_default_page_05(struct burn_drive *d, int flag)
|
|||||||
else
|
else
|
||||||
burn_write_opts_set_write_type(opts,
|
burn_write_opts_set_write_type(opts,
|
||||||
BURN_WRITE_SAO, BURN_BLOCK_SAO);
|
BURN_WRITE_SAO, BURN_BLOCK_SAO);
|
||||||
d->send_write_parameters(d, NULL, 0, opts);
|
d->send_write_parameters(d, NULL, -1, opts);
|
||||||
burn_write_opts_free(opts);
|
burn_write_opts_free(opts);
|
||||||
d->sent_default_page_05 = 1;
|
d->sent_default_page_05 = 1;
|
||||||
return 1;
|
return 1;
|
||||||
@ -2513,7 +2513,7 @@ int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
|
|||||||
if (d->drive_role != 1)
|
if (d->drive_role != 1)
|
||||||
return 0;
|
return 0;
|
||||||
if (o != NULL)
|
if (o != NULL)
|
||||||
d->send_write_parameters(d, NULL, 0, o);
|
d->send_write_parameters(d, NULL, -1, o);
|
||||||
ret = d->get_nwa(d, trackno, lba, nwa);
|
ret = d->get_nwa(d, trackno, lba, nwa);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2566,7 +2566,7 @@ off_t burn_disc_available_space(struct burn_drive *d,
|
|||||||
(off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048);
|
(off_t) (512 * 1024 * 1024 - 1) * (off_t) 2048);
|
||||||
} else {
|
} else {
|
||||||
if (o != NULL)
|
if (o != NULL)
|
||||||
d->send_write_parameters(d, NULL, 0, o);
|
d->send_write_parameters(d, NULL, -1, o);
|
||||||
d->get_nwa(d, -1, &lba, &nwa);
|
d->get_nwa(d, -1, &lba, &nwa);
|
||||||
}
|
}
|
||||||
if (o != NULL) {
|
if (o != NULL) {
|
||||||
|
@ -1932,6 +1932,22 @@ int burn_session_add_track(struct burn_session *s, struct burn_track *t,
|
|||||||
int burn_session_remove_track(struct burn_session *s, struct burn_track *t);
|
int burn_session_remove_track(struct burn_session *s, struct burn_track *t);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts B20107 */
|
||||||
|
/** Set the number which shall be written as CD track number with the first
|
||||||
|
track of the session. The following tracks will then get written with
|
||||||
|
consequtive CD track numbers. The resulting number of the last track
|
||||||
|
must not exceed 99. The lowest possible start number is 1, which is also
|
||||||
|
the default. This setting applies only to CD SAO writing.
|
||||||
|
@param session The session to be manipulated
|
||||||
|
@param tno A number between 1 and 99
|
||||||
|
@param flag Bitfield for control purposes. Unused yet. Submit 0.
|
||||||
|
@return > 0 indicates success, <= 0 indicates failure
|
||||||
|
@since 1.2.0
|
||||||
|
*/
|
||||||
|
int burn_session_set_start_tno(struct burn_session *session, int tno,
|
||||||
|
int flag);
|
||||||
|
|
||||||
|
|
||||||
/* ts B11206 */
|
/* ts B11206 */
|
||||||
/** Set the Character Codes, the Copyright bytes, and the Language Codes
|
/** Set the Character Codes, the Copyright bytes, and the Language Codes
|
||||||
for CD-TEXT blocks 0 to 7. They will be used in the block summaries
|
for CD-TEXT blocks 0 to 7. They will be used in the block summaries
|
||||||
|
@ -129,6 +129,7 @@ burn_session_input_sheet_v07t;
|
|||||||
burn_session_remove_track;
|
burn_session_remove_track;
|
||||||
burn_session_set_cdtext;
|
burn_session_set_cdtext;
|
||||||
burn_session_set_cdtext_par;
|
burn_session_set_cdtext_par;
|
||||||
|
burn_session_set_start_tno;
|
||||||
burn_set_messenger;
|
burn_set_messenger;
|
||||||
burn_set_scsi_logging;
|
burn_set_scsi_logging;
|
||||||
burn_set_signal_handling;
|
burn_set_signal_handling;
|
||||||
|
@ -593,6 +593,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
|||||||
0x00020198 (FAILURE,HIGH) = CD-TEXT pack file readability problem
|
0x00020198 (FAILURE,HIGH) = CD-TEXT pack file readability problem
|
||||||
0x00020199 (SORRY,HIGH) = Text input file reading aborted
|
0x00020199 (SORRY,HIGH) = Text input file reading aborted
|
||||||
0x0002019a (SORRY,HIGH) = Bad track index number
|
0x0002019a (SORRY,HIGH) = Bad track index number
|
||||||
|
0x0002019b (SORRY,HIGH) = CD track number exceeds range of 1 to 99
|
||||||
|
|
||||||
|
|
||||||
libdax_audioxtr:
|
libdax_audioxtr:
|
||||||
|
@ -4020,7 +4020,7 @@ int mmc_get_write_performance(struct burn_drive *d)
|
|||||||
is the eventual duty of the caller.
|
is the eventual duty of the caller.
|
||||||
*/
|
*/
|
||||||
int mmc_compose_mode_page_5(struct burn_drive *d, struct burn_session *s,
|
int mmc_compose_mode_page_5(struct burn_drive *d, struct burn_session *s,
|
||||||
int tno, const struct burn_write_opts *o,
|
int tnum, const struct burn_write_opts *o,
|
||||||
unsigned char *pd)
|
unsigned char *pd)
|
||||||
{
|
{
|
||||||
unsigned char *catalog = NULL;
|
unsigned char *catalog = NULL;
|
||||||
@ -4154,9 +4154,9 @@ fprintf(stderr, "libburn_EXPERIMENTAL: block_type = %d, pd[4]= %u\n",
|
|||||||
/* SCMS at byte 3 bit 4 */
|
/* SCMS at byte 3 bit 4 */
|
||||||
isrc_text[0] = 0;
|
isrc_text[0] = 0;
|
||||||
if (s != NULL && o->write_type == BURN_WRITE_TAO) {
|
if (s != NULL && o->write_type == BURN_WRITE_TAO) {
|
||||||
if (tno >= 1 && tno <= s->tracks) {
|
if (tnum >= 0 && tnum < s->tracks) {
|
||||||
if (s->track[tno - 1]->isrc.has_isrc) {
|
if (s->track[tnum]->isrc.has_isrc) {
|
||||||
isrc = &(s->track[tno - 1]->isrc);
|
isrc = &(s->track[tnum]->isrc);
|
||||||
isrc_text[0] = isrc->country[0];
|
isrc_text[0] = isrc->country[0];
|
||||||
isrc_text[1] = isrc->country[1];
|
isrc_text[1] = isrc->country[1];
|
||||||
isrc_text[2] = isrc->owner[0];
|
isrc_text[2] = isrc->owner[0];
|
||||||
@ -4166,8 +4166,8 @@ fprintf(stderr, "libburn_EXPERIMENTAL: block_type = %d, pd[4]= %u\n",
|
|||||||
(unsigned int) isrc->year,
|
(unsigned int) isrc->year,
|
||||||
isrc->serial);
|
isrc->serial);
|
||||||
}
|
}
|
||||||
if ((s->track[tno - 1]->mode & BURN_SCMS) &&
|
if ((s->track[tnum]->mode & BURN_SCMS) &&
|
||||||
!(s->track[tno - 1]->mode & BURN_COPY))
|
!(s->track[tnum]->mode & BURN_COPY))
|
||||||
pd[3] |= 0x10;
|
pd[3] |= 0x10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,8 +287,7 @@ int spc_get_erase_progress(struct burn_drive *d)
|
|||||||
BURN_ALLOC_MEM(b, struct buffer, 1);
|
BURN_ALLOC_MEM(b, struct buffer, 1);
|
||||||
spc_request_sense(d, b);
|
spc_request_sense(d, b);
|
||||||
|
|
||||||
/* Now checking the the preconditions as of SPC-3 4.5.2.4.4 and 4.5.3
|
/* Checking the preconditions as of SPC-3 4.5.2.4.4 and 4.5.3 */
|
||||||
*/
|
|
||||||
ret = -1;
|
ret = -1;
|
||||||
if (b->data[0] == 0x70 &&
|
if (b->data[0] == 0x70 &&
|
||||||
((b->data[2] & 0x0f) == 0 || (b->data[2] & 0x0f) == 2) &&
|
((b->data[2] & 0x0f) == 0 || (b->data[2] & 0x0f) == 2) &&
|
||||||
@ -749,7 +748,7 @@ Write Parameters Mode Page (05h) is MMC (Table 108 in MMC-1).
|
|||||||
Thus the filling of the mode page is done by mmc_compose_mode_page_5().
|
Thus the filling of the mode page is done by mmc_compose_mode_page_5().
|
||||||
*/
|
*/
|
||||||
void spc_select_write_params(struct burn_drive *d, struct burn_session *s,
|
void spc_select_write_params(struct burn_drive *d, struct burn_session *s,
|
||||||
int tno, const struct burn_write_opts *o)
|
int tnum, const struct burn_write_opts *o)
|
||||||
{
|
{
|
||||||
struct buffer *buf = NULL;
|
struct buffer *buf = NULL;
|
||||||
struct command *c = NULL;
|
struct command *c = NULL;
|
||||||
@ -806,7 +805,7 @@ void spc_select_write_params(struct burn_drive *d, struct burn_session *s,
|
|||||||
c->page->bytes = alloc_len;
|
c->page->bytes = alloc_len;
|
||||||
|
|
||||||
/* ts A61229 */
|
/* ts A61229 */
|
||||||
if (mmc_compose_mode_page_5(d, s, tno, o, c->page->data + 8) <= 0)
|
if (mmc_compose_mode_page_5(d, s, tnum, o, c->page->data + 8) <= 0)
|
||||||
goto ex;
|
goto ex;
|
||||||
|
|
||||||
c->dir = TO_DRIVE;
|
c->dir = TO_DRIVE;
|
||||||
|
@ -88,6 +88,8 @@ struct burn_session *burn_session_create(void)
|
|||||||
s = calloc(1, sizeof(struct burn_session));
|
s = calloc(1, sizeof(struct burn_session));
|
||||||
if (s == NULL) /* ts A70825 */
|
if (s == NULL) /* ts A70825 */
|
||||||
return NULL;
|
return NULL;
|
||||||
|
s->firsttrack = 1;
|
||||||
|
s->lasttrack = 0;
|
||||||
s->refcnt = 1;
|
s->refcnt = 1;
|
||||||
s->tracks = 0;
|
s->tracks = 0;
|
||||||
s->track = NULL;
|
s->track = NULL;
|
||||||
@ -762,6 +764,27 @@ ex:;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts B20107 API */
|
||||||
|
int burn_session_set_start_tno(struct burn_session *session, int tno, int flag)
|
||||||
|
{
|
||||||
|
if (tno < 1 || tno > 99) {
|
||||||
|
libdax_msgs_submit(libdax_messenger, -1, 0x0002019b,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"CD start track number exceeds range of 1 to 99",
|
||||||
|
0, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (tno + session->tracks - 1 > 99) {
|
||||||
|
libdax_msgs_submit(libdax_messenger, -1, 0x0002019b,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"CD track number exceeds 99", 0, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
session->firsttrack = tno;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct burn_cdtext *burn_cdtext_create(void)
|
struct burn_cdtext *burn_cdtext_create(void)
|
||||||
{
|
{
|
||||||
struct burn_cdtext *t;
|
struct burn_cdtext *t;
|
||||||
|
@ -556,6 +556,13 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
goto failed;
|
goto failed;
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
if (session->firsttrack + ntr - 1 > 99) {
|
||||||
|
libdax_msgs_submit(libdax_messenger, -1, 0x0002019b,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"CD track number exceeds 99", 0, 0);
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
session->lasttrack = session->firsttrack + ntr - 1;
|
||||||
|
|
||||||
d->toc_entry = calloc(d->toc_entries, sizeof(struct burn_toc_entry));
|
d->toc_entry = calloc(d->toc_entries, sizeof(struct burn_toc_entry));
|
||||||
e = d->toc_entry;
|
e = d->toc_entry;
|
||||||
@ -564,11 +571,11 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
e[0].control = TOC_CONTROL_AUDIO;
|
e[0].control = TOC_CONTROL_AUDIO;
|
||||||
else
|
else
|
||||||
e[0].control = TOC_CONTROL_DATA;
|
e[0].control = TOC_CONTROL_DATA;
|
||||||
e[0].pmin = 1;
|
e[0].pmin = session->firsttrack;
|
||||||
e[0].psec = o->format;
|
e[0].psec = o->format;
|
||||||
e[0].adr = 1;
|
e[0].adr = 1;
|
||||||
e[1].point = 0xA1;
|
e[1].point = 0xA1;
|
||||||
e[1].pmin = ntr;
|
e[1].pmin = session->lasttrack;
|
||||||
e[1].adr = 1;
|
e[1].adr = 1;
|
||||||
if (tar[ntr - 1]->mode & BURN_AUDIO)
|
if (tar[ntr - 1]->mode & BURN_AUDIO)
|
||||||
e[1].control = TOC_CONTROL_AUDIO;
|
e[1].control = TOC_CONTROL_AUDIO;
|
||||||
@ -596,8 +603,8 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
scms = 0;
|
scms = 0;
|
||||||
|
|
||||||
if (tar[i]->isrc.has_isrc) {
|
if (tar[i]->isrc.has_isrc) {
|
||||||
ret = add_isrc_cue(sheet, ctladr, i + 1,
|
ret = add_isrc_cue(sheet, ctladr,
|
||||||
&(tar[i]->isrc));
|
i + session->firsttrack, &(tar[i]->isrc));
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
@ -621,7 +628,7 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
|
|
||||||
if (j == 1) {
|
if (j == 1) {
|
||||||
tar[i]->entry = &e[3 + i];
|
tar[i]->entry = &e[3 + i];
|
||||||
e[3 + i].point = i + 1;
|
e[3 + i].point = i + session->firsttrack;
|
||||||
burn_lba_to_msf(runtime, &m, &s, &f);
|
burn_lba_to_msf(runtime, &m, &s, &f);
|
||||||
e[3 + i].pmin = m;
|
e[3 + i].pmin = m;
|
||||||
e[3 + i].psec = s;
|
e[3 + i].psec = s;
|
||||||
@ -638,7 +645,8 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
/* >>> check index with track size */;
|
/* >>> check index with track size */;
|
||||||
|
|
||||||
tar[i]->index[j] += runtime;
|
tar[i]->index[j] += runtime;
|
||||||
ret = add_cue(sheet, ctladr | 1, i + 1, j, form, scms,
|
ret = add_cue(sheet, ctladr | 1,
|
||||||
|
i + session->firsttrack, j, form, scms,
|
||||||
tar[i]->index[j]);
|
tar[i]->index[j]);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
@ -649,8 +657,8 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
#else /* Libburn_track_multi_indeX */
|
#else /* Libburn_track_multi_indeX */
|
||||||
|
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
ret = add_cue(sheet, ctladr | 1, 1, 0, form, 0,
|
ret = add_cue(sheet, ctladr | 1, session->firsttrack,
|
||||||
runtime);
|
0, form, 0, runtime);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
runtime += 150;
|
runtime += 150;
|
||||||
@ -660,8 +668,9 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
be to compare tar[]->mode or bit2 of ctladr.
|
be to compare tar[]->mode or bit2 of ctladr.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = add_cue(sheet, ctladr | 1, i + 1, 0, form, scms,
|
ret = add_cue(sheet, ctladr | 1,
|
||||||
runtime);
|
i + session->firsttrack, 0, form, scms,
|
||||||
|
runtime);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
@ -693,7 +702,7 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
/* XXX HERE IS WHERE WE DO INDICES IN THE CUE SHEET */
|
/* XXX HERE IS WHERE WE DO INDICES IN THE CUE SHEET */
|
||||||
/* XXX and we should make sure the gaps conform to ecma-130... */
|
/* XXX and we should make sure the gaps conform to ecma-130... */
|
||||||
tar[i]->entry = &e[3 + i];
|
tar[i]->entry = &e[3 + i];
|
||||||
e[3 + i].point = i + 1;
|
e[3 + i].point = i + session->firsttrack;
|
||||||
burn_lba_to_msf(runtime, &m, &s, &f);
|
burn_lba_to_msf(runtime, &m, &s, &f);
|
||||||
e[3 + i].pmin = m;
|
e[3 + i].pmin = m;
|
||||||
e[3 + i].psec = s;
|
e[3 + i].psec = s;
|
||||||
@ -701,8 +710,8 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
e[3 + i].adr = 1;
|
e[3 + i].adr = 1;
|
||||||
e[3 + i].control = type_to_ctrl(tar[i]->mode);
|
e[3 + i].control = type_to_ctrl(tar[i]->mode);
|
||||||
|
|
||||||
ret = add_cue(sheet, ctladr | 1, i + 1, 1, form, scms,
|
ret = add_cue(sheet, ctladr | 1, i + session->firsttrack,
|
||||||
runtime);
|
1, form, scms, runtime);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
@ -1084,7 +1093,7 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
{ ret = 0; goto ex; }
|
{ ret = 0; goto ex; }
|
||||||
} else {
|
} else {
|
||||||
o->control = t->entry->control;
|
o->control = t->entry->control;
|
||||||
d->send_write_parameters(d, s, tnum + 1, o);
|
d->send_write_parameters(d, s, tnum, o);
|
||||||
|
|
||||||
/* ts A61103 */
|
/* ts A61103 */
|
||||||
ret = d->get_nwa(d, -1, &lba, &nwa);
|
ret = d->get_nwa(d, -1, &lba, &nwa);
|
||||||
@ -1425,7 +1434,7 @@ int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o,
|
|||||||
off_t size;
|
off_t size;
|
||||||
|
|
||||||
BURN_ALLOC_MEM(msg, char, 160);
|
BURN_ALLOC_MEM(msg, char, 160);
|
||||||
d->send_write_parameters(d, NULL, 0, o);
|
d->send_write_parameters(d, NULL, -1, o);
|
||||||
ret = d->get_nwa(d, -1, &lba, &nwa);
|
ret = d->get_nwa(d, -1, &lba, &nwa);
|
||||||
sprintf(msg,
|
sprintf(msg,
|
||||||
"DVD pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d",
|
"DVD pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d",
|
||||||
@ -2096,7 +2105,7 @@ int burn_disc_setup_dvd_minus_rw(struct burn_write_opts *o,
|
|||||||
5.4.14 finally states that profile 0013h includes feature
|
5.4.14 finally states that profile 0013h includes feature
|
||||||
002Ch rather than 0026h.
|
002Ch rather than 0026h.
|
||||||
|
|
||||||
d->send_write_parameters(d, NULL, 0, o);
|
d->send_write_parameters(d, NULL, -1, o);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
d->busy = BURN_DRIVE_FORMATTING;
|
d->busy = BURN_DRIVE_FORMATTING;
|
||||||
@ -2852,7 +2861,7 @@ return crap. so we send the command, then ignore the result.
|
|||||||
s = disc->session[0];
|
s = disc->session[0];
|
||||||
else
|
else
|
||||||
s = NULL;
|
s = NULL;
|
||||||
d->send_write_parameters(d, s, 0, o);
|
d->send_write_parameters(d, s, -1, o);
|
||||||
|
|
||||||
ret = d->get_nwa(d, -1, &lba, &nwa);
|
ret = d->get_nwa(d, -1, &lba, &nwa);
|
||||||
sprintf(msg,
|
sprintf(msg,
|
||||||
@ -3174,7 +3183,7 @@ int burn_disc_close_damaged(struct burn_write_opts *o, int flag)
|
|||||||
o->write_type = BURN_WRITE_TAO; /* no action without TAO */
|
o->write_type = BURN_WRITE_TAO; /* no action without TAO */
|
||||||
|
|
||||||
/* Send mode page 5 */;
|
/* Send mode page 5 */;
|
||||||
d->send_write_parameters(d, NULL, 0, o);
|
d->send_write_parameters(d, NULL, -1, o);
|
||||||
|
|
||||||
ret = burn_write_close_session(o);
|
ret = burn_write_close_session(o);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
@ -3185,7 +3194,7 @@ int burn_disc_close_damaged(struct burn_write_opts *o, int flag)
|
|||||||
o->write_type = BURN_WRITE_TAO; /* no action without TAO */
|
o->write_type = BURN_WRITE_TAO; /* no action without TAO */
|
||||||
|
|
||||||
/* Send mode page 5 */;
|
/* Send mode page 5 */;
|
||||||
d->send_write_parameters(d, NULL, 0, o);
|
d->send_write_parameters(d, NULL, -1, o);
|
||||||
|
|
||||||
ret = burn_disc_close_track_dvd_minus_r(o, 0);
|
ret = burn_disc_close_track_dvd_minus_r(o, 0);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user