void FileList::PluginEndSelection() { if (SelectedFirst) { SortFileList(TRUE); } }
/* DefaultName - имя элемента на которое позиционируемся. Closed - панель закрывается, если в PrevDataList что-то есть - восстанавливаемчся оттуда. UsePrev - если востанавливаемся из PrevDataList, элемент для позиционирования брать оттуда же. Position - надо ли вообще устанавливать текущий элемент. */ void FileList::PopPrevData(const string& DefaultName,bool Closed,bool UsePrev,bool Position,bool SetDirectorySuccess) { string strName(DefaultName); if (Closed && !PrevDataList.Empty()) { PrevDataItem* Item=*PrevDataList.Last(); PrevDataList.Delete(PrevDataList.Last()); if (Item->PrevFileCount>0) { MoveSelection(ListData,FileCount,Item->PrevListData,Item->PrevFileCount); UpperFolderTopFile = Item->PrevTopFile; if (UsePrev) strName = Item->strPrevName; DeleteListData(Item->PrevListData,Item->PrevFileCount); delete Item; if (SelectedFirst) SortFileList(FALSE); else if (FileCount>0) SortFileList(TRUE); } } if (Position) { long Pos=FindFile(PointToName(strName)); if (Pos!=-1) CurFile=Pos; else GoToFile(strName); CurTopFile=UpperFolderTopFile; UpperFolderTopFile=0; CorrectPosition(); } /* $ 26.04.2001 DJ доделка про несброс выделения при неудаче SetDirectory */ else if (SetDirectorySuccess) CurFile=CurTopFile=0; }
/* Функция для вызова команды "Архивные команды" (Shift-F3) */ void FileList::ProcessHostFile() { _ALGO(CleverSysLog clv(L"FileList::ProcessHostFile()")); //_ALGO(SysLog(L"FileName='%s'",(FileName?FileName:"(nullptr)"))); if (FileCount>0 && SetCurPath()) { int Done=FALSE; SaveSelection(); if (PanelMode==PLUGIN_PANEL && !(*PluginsList.Last())->strHostFile.IsEmpty()) { PluginPanelItem *ItemList; int ItemNumber; _ALGO(SysLog(L"call CreatePluginItemList")); CreatePluginItemList(ItemList,ItemNumber); _ALGO(SysLog(L"call Plugins.ProcessHostFile")); Done=CtrlObject->Plugins->ProcessHostFile(hPlugin,ItemList,ItemNumber,0); if (Done) SetPluginModified(); else { if (!ReturnCurrentFile) PluginClearSelection(ItemList,ItemNumber); Redraw(); } _ALGO(SysLog(L"call DeletePluginItemList")); DeletePluginItemList(ItemList,ItemNumber); if (Done) ClearSelection(); } else { size_t SCount=GetRealSelCount(); if (SCount > 0) { for (int I=0; I < FileCount; ++I) { if (ListData[I]->Selected) { Done=ProcessOneHostFile(I); if (Done == 1) Select(ListData[I],0); else if (Done == -1) continue; else // Если ЭТО убрать, то... будем жать ESC до потере пулься break; // } } if (SelectedFirst) SortFileList(TRUE); } else { if ((Done=ProcessOneHostFile(CurFile)) == 1) ClearSelection(); } } if (Done) { Update(UPDATE_KEEP_SELECTION); Redraw(); Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(this); AnotherPanel->Update(UPDATE_KEEP_SELECTION|UPDATE_SECONDARY); AnotherPanel->Redraw(); } } }
void FileList::UpdatePlugin(int KeepSelection, int IgnoreVisible) { _ALGO(CleverSysLog clv(L"FileList::UpdatePlugin")); _ALGO(SysLog(L"(KeepSelection=%d, IgnoreVisible=%d)",KeepSelection,IgnoreVisible)); if (!IsVisible() && !IgnoreVisible) { UpdateRequired=TRUE; UpdateRequiredMode=KeepSelection; return; } DizRead=FALSE; FileListItem *CurPtr, **OldData=0; string strCurName, strNextCurName; int OldFileCount=0; StopFSWatcher(); LastCurFile=-1; OpenPanelInfo Info; CtrlObject->Plugins->GetOpenPanelInfo(hPlugin,&Info); FreeDiskSize=0; if (Opt.ShowPanelFree) { if (Info.Flags & OPIF_REALNAMES) { unsigned __int64 TotalSize,TotalFree; if (!apiGetDiskSize(strCurDir,&TotalSize,&TotalFree,&FreeDiskSize)) FreeDiskSize=0; } else if (Info.Flags & OPIF_USEFREESIZE) FreeDiskSize=Info.FreeSize; } PluginPanelItem *PanelData=nullptr; size_t PluginFileCount; if (!CtrlObject->Plugins->GetFindData(hPlugin,&PanelData,&PluginFileCount,0)) { DeleteListData(ListData,FileCount); PopPlugin(TRUE); Update(KeepSelection); // WARP> явный хак, но очень способствует - восстанавливает позицию на панели при ошибке чтения архива. if (!PrevDataList.Empty()) GoToFile((*PrevDataList.Last())->strPrevName); return; } size_t PrevSelFileCount=SelFileCount; SelFileCount=0; SelFileSize=0; TotalFileCount=0; TotalFileSize=0; CacheSelIndex=-1; CacheSelClearIndex=-1; strPluginDizName.Clear(); if (FileCount>0) { CurPtr=ListData[CurFile]; strCurName = CurPtr->strName; if (CurPtr->Selected) { for (int i=CurFile+1; i < FileCount; i++) { CurPtr = ListData[i]; if (!CurPtr->Selected) { strNextCurName = CurPtr->strName; break; } } } } else if (Info.Flags & OPIF_ADDDOTS) { strCurName = L".."; } if (KeepSelection || PrevSelFileCount>0) { OldData=ListData; OldFileCount=FileCount; } else { DeleteListData(ListData,FileCount); } FileCount=static_cast<int>(PluginFileCount); ListData=(FileListItem**)xf_malloc(sizeof(FileListItem*)*(FileCount+1)); if (!ListData) { FileCount=0; return; } if (!Filter) Filter=new FileFilter(this,FFT_PANEL); //Рефреш текущему времени для фильтра перед началом операции Filter->UpdateCurrentTime(); CtrlObject->HiFiles->UpdateCurrentTime(); int DotsPresent=FALSE; int FileListCount=0; bool UseFilter=Filter->IsEnabledOnPanel(); for (int i=0; i < FileCount; i++) { ListData[FileListCount] = new FileListItem; FileListItem *CurListData=ListData[FileListCount]; CurListData->Clear(); if (UseFilter && !(Info.Flags & OPIF_DISABLEFILTER)) { //if (!(CurPanelData->FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) if (!Filter->FileInFilter(PanelData[i])) continue; } if (!Opt.ShowHidden && (PanelData[i].FileAttributes & (FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))) continue; //ClearStruct(*CurListData); PluginToFileListItem(&PanelData[i],CurListData); CurListData->Position=i; if (!(Info.Flags & OPIF_DISABLESORTGROUPS)/* && !(CurListData->FileAttr & FILE_ATTRIBUTE_DIRECTORY)*/) CurListData->SortGroup=CtrlObject->HiFiles->GetGroup(CurListData); else CurListData->SortGroup=DEFAULT_SORT_GROUP; if (!CurListData->DizText) { CurListData->DeleteDiz=FALSE; //CurListData->DizText=nullptr; } if (TestParentFolderName(CurListData->strName)) { DotsPresent=TRUE; CurListData->FileAttr|=FILE_ATTRIBUTE_DIRECTORY; } else if (!(CurListData->FileAttr & FILE_ATTRIBUTE_DIRECTORY)) { TotalFileCount++; } TotalFileSize += CurListData->FileSize; FileListCount++; } if (!(Info.Flags & OPIF_DISABLEHIGHLIGHTING) || (Info.Flags & OPIF_USEATTRHIGHLIGHTING)) CtrlObject->HiFiles->GetHiColor(ListData,FileListCount,(Info.Flags&OPIF_USEATTRHIGHLIGHTING)!=0); FileCount=FileListCount; if ((Info.Flags & OPIF_ADDDOTS) && !DotsPresent) { ListData[FileCount] = new FileListItem; CurPtr = ListData[FileCount]; CurPtr->Clear(); AddParentPoint(CurPtr,FileCount); if (!(Info.Flags & OPIF_DISABLEHIGHLIGHTING) || (Info.Flags & OPIF_USEATTRHIGHLIGHTING)) CtrlObject->HiFiles->GetHiColor(&CurPtr,1,(Info.Flags&OPIF_USEATTRHIGHLIGHTING)!=0); if (Info.HostFile && *Info.HostFile) { FAR_FIND_DATA_EX FindData; if (apiGetFindDataEx(Info.HostFile, FindData)) { CurPtr->WriteTime=FindData.ftLastWriteTime; CurPtr->CreationTime=FindData.ftCreationTime; CurPtr->AccessTime=FindData.ftLastAccessTime; CurPtr->ChangeTime=FindData.ftChangeTime; } } FileCount++; } if (CurFile >= FileCount) CurFile = FileCount ? FileCount-1 : 0; /* $ 25.02.2001 VVM ! Не считывать повторно список файлов с панели плагина */ if (IsColumnDisplayed(DIZ_COLUMN)) ReadDiz(PanelData,static_cast<int>(PluginFileCount),RDF_NO_UPDATE); CorrectPosition(); CtrlObject->Plugins->FreeFindData(hPlugin,PanelData,PluginFileCount); if (KeepSelection || PrevSelFileCount>0) { MoveSelection(ListData,FileCount,OldData,OldFileCount); DeleteListData(OldData,OldFileCount); } if (!KeepSelection && PrevSelFileCount>0) { SaveSelection(); ClearSelection(); } SortFileList(FALSE); if (CurFile>=FileCount || StrCmpI(ListData[CurFile]->strName,strCurName)) if (!GoToFile(strCurName) && !strNextCurName.IsEmpty()) GoToFile(strNextCurName); SetTitle(); }
void FileList::ReadFileNames(int KeepSelection, int IgnoreVisible, int DrawMessage) { TPreRedrawFuncGuard preRedrawFuncGuard(PR_ReadFileNamesMsg); TaskBar TB(false); strOriginalCurDir=strCurDir; if (!IsVisible() && !IgnoreVisible) { UpdateRequired=TRUE; UpdateRequiredMode=KeepSelection; return; } UpdateRequired=FALSE; AccessTimeUpdateRequired=FALSE; DizRead=FALSE; FAR_FIND_DATA_EX fdata; FileListItem *CurPtr=0,**OldData=0; string strCurName, strNextCurName; int OldFileCount=0; StopFSWatcher(); if (this!=CtrlObject->Cp()->LeftPanel && this!=CtrlObject->Cp()->RightPanel) return; string strSaveDir; apiGetCurrentDirectory(strSaveDir); { string strOldCurDir = strCurDir; if (!SetCurPath()) { FlushInputBuffer(); // Очистим буффер ввода, т.к. мы уже можем быть в другом месте... if (!StrCmp(strCurDir, strOldCurDir)) //?? i?? { GetPathRoot(strOldCurDir,strOldCurDir); if (!apiIsDiskInDrive(strOldCurDir)) IfGoHome(strOldCurDir.At(0)); /* При смене каталога путь не изменился */ } return; } } SortGroupsRead=FALSE; if (GetFocus()) CtrlObject->CmdLine->SetCurDir(strCurDir); LastCurFile=-1; Panel *AnotherPanel=CtrlObject->Cp()->GetAnotherPanel(this); AnotherPanel->QViewDelTempName(); size_t PrevSelFileCount=SelFileCount; SelFileCount=0; SelFileSize=0; TotalFileCount=0; TotalFileSize=0; CacheSelIndex=-1; CacheSelClearIndex=-1; if (Opt.ShowPanelFree) { unsigned __int64 TotalSize,TotalFree; if (!apiGetDiskSize(strCurDir,&TotalSize,&TotalFree,&FreeDiskSize)) FreeDiskSize=0; } if (FileCount>0) { strCurName = ListData[CurFile]->strName; if (ListData[CurFile]->Selected) { for (int i=CurFile+1; i < FileCount; i++) { CurPtr = ListData[i]; if (!CurPtr->Selected) { strNextCurName = CurPtr->strName; break; } } } } if (KeepSelection || PrevSelFileCount>0) { OldData=ListData; OldFileCount=FileCount; } else DeleteListData(ListData,FileCount); ListData=nullptr; int ReadOwners=IsColumnDisplayed(OWNER_COLUMN); int ReadNumLinks=IsColumnDisplayed(NUMLINK_COLUMN); int ReadNumStreams=IsColumnDisplayed(NUMSTREAMS_COLUMN); int ReadStreamsSize=IsColumnDisplayed(STREAMSSIZE_COLUMN); string strComputerName; if (ReadOwners) { CurPath2ComputerName(strCurDir, strComputerName); // сбросим кэш SID`ов SIDCacheFlush(); } SetLastError(ERROR_SUCCESS); int AllocatedCount=0; FileListItem *NewPtr; // сформируем заголовок вне цикла wchar_t Title[2048]; int TitleLength=Min((int)X2-X1-1,(int)(ARRAYSIZE(Title))-1); //wmemset(Title,0x0CD,TitleLength); //BUGBUG //Title[TitleLength]=0; MakeSeparator(TitleLength, Title, 9, nullptr); BOOL IsShowTitle=FALSE; BOOL NeedHighlight=Opt.Highlight && PanelMode != PLUGIN_PANEL; if (!Filter) Filter=new FileFilter(this,FFT_PANEL); //Рефреш текущему времени для фильтра перед началом операции Filter->UpdateCurrentTime(); CtrlObject->HiFiles->UpdateCurrentTime(); bool bCurDirRoot = false; ParsePath(strCurDir, nullptr, &bCurDirRoot); PATH_TYPE Type = ParsePath(strCurDir, nullptr, &bCurDirRoot); bool NetRoot = bCurDirRoot && (Type == PATH_REMOTE || Type == PATH_REMOTEUNC); FileCount = 0; string strFind = strCurDir; AddEndSlash(strFind); strFind+=L'*'; ::FindFile Find(strFind, true); DWORD FindErrorCode = ERROR_SUCCESS; bool UseFilter=Filter->IsEnabledOnPanel(); bool ReadCustomData=IsColumnDisplayed(CUSTOM_COLUMN0)!=0; DWORD StartTime = GetTickCount(); while (Find.Get(fdata)) { FindErrorCode = GetLastError(); if ((Opt.ShowHidden || !(fdata.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))) && (!UseFilter || Filter->FileInFilter(fdata, nullptr, &fdata.strFileName))) { if (FileCount>=AllocatedCount) { AllocatedCount+=4096; FileListItem **pTemp; if (!(pTemp=(FileListItem **)xf_realloc(ListData,AllocatedCount*sizeof(*ListData)))) break; ListData=pTemp; } ListData[FileCount] = new FileListItem; ListData[FileCount]->Clear(); NewPtr=ListData[FileCount]; NewPtr->FileAttr = fdata.dwFileAttributes; NewPtr->CreationTime = fdata.ftCreationTime; NewPtr->AccessTime = fdata.ftLastAccessTime; NewPtr->WriteTime = fdata.ftLastWriteTime; NewPtr->ChangeTime = fdata.ftChangeTime; NewPtr->FileSize = fdata.nFileSize; NewPtr->AllocationSize = fdata.nAllocationSize; NewPtr->strName = fdata.strFileName; NewPtr->strShortName = fdata.strAlternateFileName; NewPtr->Position=FileCount++; NewPtr->NumberOfLinks=1; if (fdata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { NewPtr->ReparseTag=fdata.dwReserved0; //MSDN } if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { TotalFileSize += NewPtr->FileSize; if (ReadNumLinks) NewPtr->NumberOfLinks=GetNumberOfLinks(fdata.strFileName); } else { NewPtr->AllocationSize = 0; } NewPtr->SortGroup=DEFAULT_SORT_GROUP; if (ReadOwners) { string strOwner; GetFileOwner(strComputerName, NewPtr->strName,strOwner); NewPtr->strOwner = strOwner; } NewPtr->NumberOfStreams=NewPtr->FileAttr&FILE_ATTRIBUTE_DIRECTORY?0:1; NewPtr->StreamsSize=NewPtr->FileSize; if (ReadNumStreams||ReadStreamsSize) { EnumStreams(TestParentFolderName(fdata.strFileName)?strCurDir:fdata.strFileName,NewPtr->StreamsSize,NewPtr->NumberOfStreams); } if (ReadCustomData) CtrlObject->Plugins->GetCustomData(NewPtr); if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) TotalFileCount++; //memcpy(ListData+FileCount,&NewPtr,sizeof(NewPtr)); // FileCount++; DWORD CurTime = GetTickCount(); if (CurTime - StartTime > RedrawTimeout) { StartTime = CurTime; if (IsVisible()) { if (!IsShowTitle) { if (!DrawMessage) { Text(X1+1,Y1,ColorIndexToColor(COL_PANELBOX),Title); IsShowTitle=TRUE; SetColor(Focus ? COL_PANELSELECTEDTITLE:COL_PANELTITLE); } } LangString strReadMsg(MReadingFiles); strReadMsg << FileCount; if (DrawMessage) { ReadFileNamesMsg(strReadMsg); } else { TruncStr(strReadMsg,TitleLength-2); int MsgLength=(int)strReadMsg.GetLength(); GotoXY(X1+1+(TitleLength-MsgLength-1)/2,Y1); FS<<L" "<<strReadMsg<<L" "; } } if (CheckForEsc()) { break; } } } } if (!(FindErrorCode==ERROR_SUCCESS || FindErrorCode==ERROR_NO_MORE_FILES || FindErrorCode==ERROR_FILE_NOT_FOUND)) Message(MSG_WARNING|MSG_ERRORTYPE,1,MSG(MError),MSG(MReadFolderError),MSG(MOk)); if ((Opt.ShowDotsInRoot || !bCurDirRoot) || (NetRoot && CtrlObject->Plugins->FindPlugin(Opt.KnownIDs.Network))) // NetWork Plugin { if (FileCount>=AllocatedCount) { FileListItem **pTemp; if ((pTemp=(FileListItem **)xf_realloc(ListData,(FileCount+1)*sizeof(*ListData)))) ListData=pTemp; } if (ListData) { ListData[FileCount] = new FileListItem; string TwoDotsOwner; if (ReadOwners) { GetFileOwner(strComputerName,strCurDir,TwoDotsOwner); } FILETIME TwoDotsTimes[4]={}; if(apiGetFindDataEx(strCurDir,fdata)) { TwoDotsTimes[0]=fdata.ftCreationTime; TwoDotsTimes[1]=fdata.ftLastAccessTime; TwoDotsTimes[2]=fdata.ftLastWriteTime; TwoDotsTimes[3]=fdata.ftChangeTime; } AddParentPoint(ListData[FileCount],FileCount,TwoDotsTimes,TwoDotsOwner); FileCount++; } } if (IsColumnDisplayed(DIZ_COLUMN)) ReadDiz(); if (NeedHighlight) { CtrlObject->HiFiles->GetHiColor(ListData, FileCount); } if (AnotherPanel->GetMode()==PLUGIN_PANEL) { HANDLE hAnotherPlugin=AnotherPanel->GetPluginHandle(); PluginPanelItem *PanelData=nullptr; string strPath; size_t PanelCount=0; strPath = strCurDir; AddEndSlash(strPath); if (CtrlObject->Plugins->GetVirtualFindData(hAnotherPlugin,&PanelData,&PanelCount,strPath)) { FileListItem **pTemp; if ((pTemp=(FileListItem **)xf_realloc(ListData,(FileCount+PanelCount)*sizeof(*ListData)))) { ListData=pTemp; for (size_t i=0; i < PanelCount; i++) { CurPtr = ListData[FileCount+i]; PluginPanelItem &pfdata=PanelData[i]; PluginToFileListItem(&PanelData[i],CurPtr); CurPtr->Position=FileCount; TotalFileSize += pfdata.FileSize; CurPtr->PrevSelected=CurPtr->Selected=0; CurPtr->ShowFolderSize=0; CurPtr->SortGroup=CtrlObject->HiFiles->GetGroup(CurPtr); if (!TestParentFolderName(pfdata.FileName) && !(CurPtr->FileAttr & FILE_ATTRIBUTE_DIRECTORY)) TotalFileCount++; } // цветовую боевую раскраску в самом конце, за один раз CtrlObject->HiFiles->GetHiColor(&ListData[FileCount],PanelCount); FileCount+=static_cast<int>(PanelCount); } CtrlObject->Plugins->FreeVirtualFindData(hAnotherPlugin,PanelData,PanelCount); } } InitFSWatcher(false); CorrectPosition(); if (KeepSelection || PrevSelFileCount>0) { MoveSelection(ListData,FileCount,OldData,OldFileCount); DeleteListData(OldData,OldFileCount); } if (SortGroups) ReadSortGroups(false); if (!KeepSelection && PrevSelFileCount>0) { SaveSelection(); ClearSelection(); } SortFileList(FALSE); if (CurFile>=FileCount || StrCmpI(ListData[CurFile]->strName,strCurName)) if (!GoToFile(strCurName) && !strNextCurName.IsEmpty()) GoToFile(strNextCurName); /* $ 13.02.2002 DJ SetTitle() - только если мы текущий фрейм! */ if (CtrlObject->Cp() == FrameManager->GetCurrentFrame()) SetTitle(); FarChDir(strSaveDir); //??? }
void CMeterUploader::UploadMeteringData() { DIR *dir_fdesc; dirent *dp; time_t now; char szTime[30]; char szFileName[128]; char szStart[25], szEnd[25]; TIMESTAMP tmStart, tmEnd; int i, nFileCount = 0, nSuccess=0; if(!m_bUserRequest && !m_bImmediatelyRequest) { m_bImmediatelyRequest = FALSE; if(!CheckUploadTime()) return; } m_bImmediatelyRequest = FALSE; time(&now); MakeTimeString(szTime, &now, TRUE); // 최소값을 비교하여 보정한다. m_nUploadTryTime = MAX(m_nUploadTryTime, 1); XDEBUG("==================================================\r\n"); XDEBUG(" Start metering upload (TIME=%s for %d min).\r\n", szTime, m_nUploadTryTime); XDEBUG("==================================================\r\n"); UPLOAD_LOG("Start upload\r\n"); if(m_bUserRequest) { GetUploadRange(&tmStart, &tmEnd); sprintf(szStart, "%04d%02d%02d%02d", tmStart.year, tmStart.mon, tmStart.day, tmStart.hour); sprintf(szEnd, "%04d%02d%02d%02d", tmEnd.year, tmEnd.mon, tmEnd.day, tmEnd.hour); } if (m_bGprsPerfTestMode == FALSE) { dir_fdesc = opendir("/app/data"); if (dir_fdesc != NULL) { for(; (dp=readdir(dir_fdesc));) { #if defined(_DIRENT_HAVE_D_TYPE) if (dp->d_type == DT_DIR) continue; #endif if (dp->d_name[0] == '.') continue; if(m_bUserRequest) { if (strncmp(dp->d_name, szStart, DATE_TIME_LEN) < 0) continue; if (strncmp(dp->d_name, szEnd, DATE_TIME_LEN) > 0) continue; }else if(strlen(dp->d_name) > DATE_TIME_LEN) continue; sprintf(szFileName, "/app/data/%s", dp->d_name); m_pList[nFileCount] = strdup(szFileName); nFileCount++; if (nFileCount >= MAX_UPLOAD_FILE_COUNT) break; } closedir(dir_fdesc); if (nFileCount > 0) { // 목록을 Sort하고 업로드한다. SortFileList(m_pList, nFileCount); nSuccess = UploadFileList(m_pList, nFileCount); for(i=0; i<nFileCount; i++) free(m_pList[i]); } } } else { printf("UPLOAD: GPRS Backhaul latency test . . .\r\n"); UploadFile("/app/sw/test.dat"); } UPLOAD_LOG("Total %d of %d file.\r\n", nSuccess, nFileCount); UPLOAD_LOG("End upload\r\n"); time(&now); MakeTimeString(szTime, &now, TRUE); if (!m_bUserRequest) time(&m_nLastUpload); XDEBUG("==================================================\r\n"); XDEBUG(" Terminate metering upload (TIME=%s).\r\n", szTime); XDEBUG("==================================================\r\n"); XDEBUG("\r\n"); }