290 lines
7.3 KiB
Plaintext
290 lines
7.3 KiB
Plaintext
#help_index "Utils"
|
|
|
|
LTDirEntry MCFindMatch(LTDirEntry *pattern,LTDirEntry *list)
|
|
{
|
|
while (list) {
|
|
if (!StrCmp(pattern->name,list->name) &&
|
|
(pattern->attr&~LT_ATTR_RESIDENT)==
|
|
list->attr&~LT_ATTR_RESIDENT)
|
|
return list;
|
|
list=list->next;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void MergeChkList(LTDirEntry *m1,LTDirEntry *m2,U8 *fuf_flags,U8 *df_flags)
|
|
{
|
|
I8 i;
|
|
LTDirEntry *tempm2;
|
|
while (m1 && !(*df_flags & DF_ABORT_ALL_FILES)) {
|
|
if (!Bt(fuf_flags,FUf_JUST_TEXT_FILES) ||
|
|
IsTextFile(m1->name) ||
|
|
m1->attr & LT_ATTR_DIR) {
|
|
tempm2=MCFindMatch(m1,m2);
|
|
if (!tempm2)
|
|
coutln "Does Not Exist:",m1->full_name;
|
|
else {
|
|
if (m1->attr & LT_ATTR_DIR)
|
|
MergeChkList(m1->sub,tempm2->sub,fuf_flags,df_flags);
|
|
else {
|
|
i=m1->datetime-tempm2->datetime;
|
|
if (AbsI8(i)>LTDATE_FREQ*2) { //Filedates can shift due to conversion
|
|
coutln m1->full_name;
|
|
if (Bt(fuf_flags,FUf_DIFF)) {
|
|
if (IsTextFile(m1->full_name))
|
|
*df_flags=Diff(tempm2->full_name,m1->full_name,*df_flags);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
m1=m1->next;
|
|
}
|
|
}
|
|
|
|
public void MergeChk(
|
|
I1 *dst_mask="/LT/*",
|
|
I1 *src_mask="/LT/*",
|
|
I1 *flags=NULL)
|
|
//+r=recurse
|
|
//+d=diff
|
|
//+t=just text files
|
|
{
|
|
U8 df_flags=0,f=0;
|
|
LTDirEntry *tempm1=NULL,*tempm2=NULL;
|
|
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),"+r");
|
|
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),flags);
|
|
PrintFWarn("This is based strictly on file dates.\r\n");
|
|
tempm1=FindFiles(src_mask,f);
|
|
tempm2=FindFiles(dst_mask,f);
|
|
MergeChkList(tempm1,tempm2,&f,&df_flags);
|
|
DelLTDirList(tempm1);
|
|
DelLTDirList(tempm2);
|
|
}
|
|
|
|
|
|
#help_index "Utils;Comm"
|
|
|
|
void MrgWaitPmt(TssStruct *tss,LTChnl *chnl)
|
|
{
|
|
WaitTskIdle(tss);
|
|
chnl->null_msg_cnt=0;
|
|
while (chnl->null_msg_cnt<2)
|
|
SwapInNext;
|
|
WaitTskIdle(tss);
|
|
}
|
|
|
|
I1 *red_st="$$FG,RED$$",*green_st="$$FG,GREEN$$";
|
|
|
|
void RmtMergeChkList(TssStruct *tss,LTChnl *chnl,LTDirEntry *m1,LTDirEntry *m2,U8 *fuf_flags,U8 *df_flags,I1 *cur_dir)
|
|
{
|
|
I8 i;
|
|
LTDirEntry *tempm2,*sub;
|
|
I1 *full_name,*c1,*c2;
|
|
BoolU4 doit;
|
|
while (m1 && !(*df_flags & DF_ABORT_ALL_FILES)) {
|
|
if (!Bt(fuf_flags,FUf_JUST_TEXT_FILES) ||
|
|
IsTextFile(m1->name) ||
|
|
m1->attr & LT_ATTR_DIR) {
|
|
tempm2=MCFindMatch(m1,m2);
|
|
if (!tempm2) {
|
|
coutln "Does Not Exist on Remote:",m1->name;
|
|
full_name=MAlloc(StrLen(cur_dir)+1+StrLen(m1->name)+1+1);
|
|
StrCpy(full_name,cur_dir);
|
|
StrCat(full_name,m1->name);
|
|
} else {
|
|
full_name=MAlloc(StrLen(cur_dir)+1+StrLen(tempm2->name)+1+1);
|
|
StrCpy(full_name,cur_dir);
|
|
StrCat(full_name,tempm2->name);
|
|
}
|
|
if (m1->attr & LT_ATTR_DIR) {
|
|
if (!tempm2) {
|
|
if (Bt(fuf_flags,FUf_ALL))
|
|
doit=TRUE;
|
|
else
|
|
doit=PopUpNoYes("MkDir on Remote?");
|
|
if (doit) {
|
|
XTalkWithWait(tss,"MkDir(\"%s\");\r",full_name);
|
|
MrgWaitPmt(tss,chnl);
|
|
}
|
|
sub=NULL;
|
|
} else
|
|
sub=tempm2->sub;
|
|
StrCat(full_name,"/");
|
|
RmtMergeChkList(tss,chnl,m1->sub,sub,fuf_flags,df_flags,full_name);
|
|
} else {
|
|
if (tempm2) {
|
|
i=m1->datetime-tempm2->datetime;
|
|
if (AbsI8(i)>LTDATE_FREQ*2) { //Filedates can shift due to conversion
|
|
if (i<0) {
|
|
c1=red_st;
|
|
c2=green_st;
|
|
} else {
|
|
c1=green_st;
|
|
c2=red_st;
|
|
}
|
|
PrintF("%s%h2D %h4T$$FG$$ %s%h2D %h4T$$FG$$\r\n %s\r\n\r\n",
|
|
c1,m1->datetime,m1->datetime,
|
|
c2,tempm2->datetime,tempm2->datetime,
|
|
m1->full_name);
|
|
if (i<0) {
|
|
if (Bt(fuf_flags,FUf_ALL))
|
|
doit=TRUE;
|
|
else
|
|
doit=PopUpNoYes("Get from Remote Overwriting?");
|
|
if (doit) {
|
|
XTalkWithWait(tss,"RmtRqstRxFile(\"%s\",\"%s\");\r",
|
|
full_name,m1->full_name);
|
|
MrgWaitPmt(tss,chnl);
|
|
}
|
|
} else {
|
|
if (Bt(fuf_flags,FUf_ALL))
|
|
doit=TRUE;
|
|
else
|
|
doit=PopUpNoYes("Send to Remote Overwriting?");
|
|
if (doit) {
|
|
XTalkWithWait(tss,"RmtRqstTxFile(\"%s\",\"%s\");\r",
|
|
full_name,m1->full_name);
|
|
MrgWaitPmt(tss,chnl);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (Bt(fuf_flags,FUf_ALL))
|
|
doit=TRUE;
|
|
else
|
|
doit=PopUpNoYes("Send to Remote?");
|
|
if (doit) {
|
|
XTalkWithWait(tss,"RmtRqstTxFile(\"%s\",\"%s\");\r",
|
|
full_name,m1->full_name);
|
|
MrgWaitPmt(tss,chnl);
|
|
}
|
|
}
|
|
}
|
|
Free(full_name);
|
|
}
|
|
m1=m1->next;
|
|
}
|
|
}
|
|
|
|
public void RmtMergeChkHost(I1 *dst_mask="/LT/*",I1 *flags=NULL)
|
|
{
|
|
LTDirEntry *tempm;
|
|
U8 size,f=0;
|
|
U1 *buf;
|
|
ArcCompressStruct *ac;
|
|
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),"+r");
|
|
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),flags);
|
|
tempm=FindFiles(dst_mask,f);
|
|
buf=FlattenLTDirTree(tempm,&size);
|
|
ac=CompressBuf(buf,size);
|
|
RmtRqstRxBuf(ac,ac->compressed_size);
|
|
Free(ac);
|
|
Free(buf);
|
|
DelLTDirList(tempm);
|
|
}
|
|
|
|
I1 *Progress1CB(Ltf *l,LtfEntry *ll,TssStruct *mem_tss)
|
|
{
|
|
I1 *st=MAlloc(16,mem_tss);
|
|
nounusedwarn l,ll;
|
|
SPrintF(st,"%08X",progress1);
|
|
return st;
|
|
}
|
|
|
|
public void RmtMergeChk(LTChnl *chnl,
|
|
I1 *dst_mask="/LT/*",
|
|
I1 *src_mask="/LT/*",
|
|
I1 *flags=NULL)
|
|
//+r=recurse
|
|
//+d=diff
|
|
//+t=Just text files
|
|
//+a=all
|
|
{
|
|
U8 df_flags=0,f=0;
|
|
LTDirEntry *tempm1=NULL,*tempm2=NULL;
|
|
TssStruct *tss;
|
|
I1 *st;
|
|
Ltf *aux;
|
|
LtfEntry *ll;
|
|
U1 *buf;
|
|
|
|
if (!chnl || !chnl->type) return;
|
|
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),"+r+t");
|
|
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),flags);
|
|
PrintFWarn("This is based strictly on file dates.\r\n");
|
|
if (tempm1=FindFiles(src_mask,f)) {
|
|
tss=SpawnUser;
|
|
tss->win_top=Fs->win_top;
|
|
tss->win_bottom=(Fs->win_top+Fs->win_bottom)>>1-1;
|
|
Fs-> win_top=tss->win_bottom+3;
|
|
tss->win_right=Fs->win_right;
|
|
tss->win_left=Fs->win_left;
|
|
WinToTop(Fs);
|
|
aux=tss->aux_ltf;
|
|
LtfPutSExt(aux,"$$CM+BY,0,0$$");
|
|
ll=LtfPutSExt(aux,"$$TX+DC+LX+IV,\"00000000\"$$");
|
|
ll->display_cb=&Progress1CB;
|
|
XTalkWithWait(tss,"TelnetGuestOpen(0x%08X);\r",chnl);
|
|
MrgWaitPmt(tss,chnl);
|
|
XTalkWithWait(tss,"RmtMergeChkHost(\"%s\",\"%s\");\r",dst_mask,flags);
|
|
MrgWaitPmt(tss,chnl);
|
|
buf=ExpandBuf(chnl->rx_buf);
|
|
Free(chnl->rx_buf,tss);
|
|
tempm2=UnflattenLTDirTree(buf);
|
|
Free(buf);
|
|
st =MAlloc(StrLen(dst_mask)+3);
|
|
StrCpy(st,dst_mask);
|
|
RemoveLastSeg(st,"/");
|
|
if (!*st) {
|
|
Free(st);
|
|
st=NewStr("./");
|
|
} else
|
|
StrCat(st,"/");
|
|
|
|
RmtMergeChkList(tss,chnl,tempm1,tempm2,&f,&df_flags,st);
|
|
Free(st);
|
|
DelLTDirList(tempm1);
|
|
DelLTDirList(tempm2);
|
|
XTalkStrWithWait(tss,"Msg(MSG_KEY_DOWN,CH_CTRLB,SCF_CTRL+SCF_ALT);");
|
|
Fs->win_top=tss->win_top;
|
|
Sleep(250); //allow shutdown of Guest channel
|
|
Kill(tss);
|
|
}
|
|
}
|
|
|
|
#help_index "Utils"
|
|
|
|
void ListNewFilesList(LTDirEntry *tempm,LTDate datetime,U8 f)
|
|
{
|
|
while (tempm) {
|
|
if (tempm->datetime>datetime)
|
|
if (!Bt(&f,FUf_JUST_TEXT_FILES) ||
|
|
IsTextFile(tempm->name))
|
|
coutln tempm->full_name;
|
|
ListNewFilesList(tempm->sub,datetime,f);
|
|
tempm=tempm->next;
|
|
}
|
|
}
|
|
|
|
public void ListNewFiles(I1 *src_mask="/LT/*",LTDate datetime=0,
|
|
I1 *flags=NULL)
|
|
//+r=recurse
|
|
//+t=Just text files
|
|
{
|
|
U8 f=0;
|
|
LTDirEntry *tempm1=NULL;
|
|
|
|
if (!datetime)
|
|
datetime=sys_compile_time;
|
|
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),"+r+t");
|
|
GetFFlags(&f,SysText("ST_FILE_UTIL_FLAGS"),flags);
|
|
|
|
if (tempm1=FindFiles(src_mask,f)) {
|
|
ListNewFilesList(tempm1,datetime,f);
|
|
DelLTDirList(tempm1);
|
|
}
|
|
}
|
|
|
|
#help_index ""
|