00001 #include <qdeepcopy.h>
00002 #include <qfile.h>
00003 #include <qstringlist.h>
00004 #include <unistd.h>
00005
00006 #include "util.h"
00007 #include "remoteutil.h"
00008 #include "cardutil.h"
00009 #include "inputinfo.h"
00010 #include "programinfo.h"
00011 #include "mythcontext.h"
00012 #include "remoteencoder.h"
00013 #include "tv_rec.h"
00014
00015 uint RemoteGetFlags(uint cardid)
00016 {
00017 if (gContext->IsBackend())
00018 {
00019 const TVRec *rec = TVRec::GetTVRec(cardid);
00020 if (rec)
00021 return rec->GetFlags();
00022 }
00023
00024 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(cardid);
00025 strlist << "GET_FLAGS";
00026 if (!gContext->SendReceiveStringList(strlist) || strlist.empty())
00027 return 0;
00028
00029 return strlist[0].toInt();
00030 }
00031
00032 uint RemoteGetState(uint cardid)
00033 {
00034 if (gContext->IsBackend())
00035 {
00036 const TVRec *rec = TVRec::GetTVRec(cardid);
00037 if (rec)
00038 return rec->GetState();
00039 }
00040
00041 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(cardid);
00042 strlist << "GET_STATE";
00043 if (!gContext->SendReceiveStringList(strlist) || strlist.empty())
00044 return kState_ChangingState;
00045
00046 return strlist[0].toInt();
00047 }
00048
00049 vector<ProgramInfo *> *RemoteGetRecordedList(bool deltype)
00050 {
00051 QString str = "QUERY_RECORDINGS ";
00052 if (deltype)
00053 str += "Delete";
00054 else
00055 str += "Play";
00056
00057 QStringList strlist = str;
00058
00059 vector<ProgramInfo *> *info = new vector<ProgramInfo *>;
00060
00061 if (!RemoteGetRecordingList(info, strlist))
00062 {
00063 delete info;
00064 return NULL;
00065 }
00066
00067 return info;
00068 }
00069
00073 vector<FileSystemInfo> RemoteGetFreeSpace()
00074 {
00075 FileSystemInfo fsInfo;
00076 vector<FileSystemInfo> fsInfos;
00077 QStringList strlist = QString("QUERY_FREE_SPACE_LIST");
00078
00079 if (gContext->SendReceiveStringList(strlist))
00080 {
00081 QStringList::const_iterator it = strlist.begin();
00082 while (it != strlist.end())
00083 {
00084 fsInfo.hostname = *(it++);
00085 fsInfo.directory = *(it++);
00086 fsInfo.isLocal = (*(it++)).toInt();
00087 fsInfo.fsID = (*(it++)).toInt();
00088 fsInfo.dirID = (*(it++)).toInt();
00089 fsInfo.totalSpaceKB = decodeLongLong(strlist, it);
00090 fsInfo.usedSpaceKB = decodeLongLong(strlist, it);
00091 fsInfos.push_back(fsInfo);
00092 }
00093 }
00094
00095 return fsInfos;
00096 }
00097
00098 bool RemoteGetLoad(float load[3])
00099 {
00100 QStringList strlist = QString("QUERY_LOAD");
00101
00102 if (gContext->SendReceiveStringList(strlist))
00103 {
00104 load[0] = strlist[0].toFloat();
00105 load[1] = strlist[1].toFloat();
00106 load[2] = strlist[2].toFloat();
00107 return true;
00108 }
00109
00110 return false;
00111 }
00112
00113 bool RemoteGetUptime(time_t &uptime)
00114 {
00115 QStringList strlist = QString("QUERY_UPTIME");
00116
00117 if (!gContext->SendReceiveStringList(strlist))
00118 return false;
00119
00120 if (!strlist[0].at(0).isNumber())
00121 return false;
00122
00123 if (sizeof(time_t) == sizeof(int))
00124 uptime = strlist[0].toUInt();
00125 else if (sizeof(time_t) == sizeof(long))
00126 uptime = strlist[0].toULong();
00127 #if QT_VERSION >= 0x030200
00128 else if (sizeof(time_t) == sizeof(long long))
00129 uptime = strlist[0].toULongLong();
00130 #endif
00131
00132 return true;
00133 }
00134
00135 bool RemoteGetMemStats(int &totalMB, int &freeMB, int &totalVM, int &freeVM)
00136 {
00137 QStringList strlist = QString("QUERY_MEMSTATS");
00138
00139 if (gContext->SendReceiveStringList(strlist))
00140 {
00141 totalMB = strlist[0].toInt();
00142 freeMB = strlist[1].toInt();
00143 totalVM = strlist[2].toInt();
00144 freeVM = strlist[3].toInt();
00145 return true;
00146 }
00147
00148 return false;
00149 }
00150
00151 bool RemoteCheckFile(ProgramInfo *pginfo, bool checkSlaves)
00152 {
00153 QStringList strlist = "QUERY_CHECKFILE";
00154 strlist << QString::number((int)checkSlaves);
00155 pginfo->ToStringList(strlist);
00156
00157 if ((!gContext->SendReceiveStringList(strlist)) ||
00158 (!strlist[0].toInt()))
00159 return false;
00160
00161
00162
00163 QString localpath = strlist[1];
00164 QFile checkFile(localpath);
00165 if (checkFile.exists())
00166 pginfo->pathname = localpath;
00167
00168 return true;
00169 }
00170
00171 bool RemoteRecordPending(uint cardid, const ProgramInfo *pginfo,
00172 int secsleft, bool hasLater)
00173 {
00174 if (gContext->IsBackend())
00175 {
00176 TVRec *rec = TVRec::GetTVRec(cardid);
00177 if (rec)
00178 {
00179 rec->RecordPending(pginfo, secsleft, hasLater);
00180 return true;
00181 }
00182 }
00183
00184 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(cardid);
00185 strlist << "RECORD_PENDING";
00186 strlist << QString::number(secsleft);
00187 strlist << QString::number(hasLater);
00188 pginfo->ToStringList(strlist);
00189
00190 if (!gContext->SendReceiveStringList(strlist) || strlist.empty())
00191 return false;
00192
00193 return strlist[0].upper() == "OK";
00194 }
00195
00196 void RemoteStopRecording(ProgramInfo *pginfo)
00197 {
00198 QStringList strlist = QString("STOP_RECORDING");
00199 pginfo->ToStringList(strlist);
00200
00201 gContext->SendReceiveStringList(strlist);
00202 }
00203
00204 bool RemoteStopLiveTV(uint cardid)
00205 {
00206 if (gContext->IsBackend())
00207 {
00208 TVRec *rec = TVRec::GetTVRec(cardid);
00209 if (rec)
00210 {
00211 rec->StopLiveTV();
00212 return true;
00213 }
00214 }
00215
00216 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(cardid);
00217 strlist << "STOP_LIVETV";
00218
00219 if (!gContext->SendReceiveStringList(strlist) || strlist.empty())
00220 return false;
00221
00222 return strlist[0].upper() == "OK";
00223 }
00224
00225 bool RemoteStopRecording(uint cardid)
00226 {
00227 if (gContext->IsBackend())
00228 {
00229 TVRec *rec = TVRec::GetTVRec(cardid);
00230 if (rec)
00231 {
00232 rec->StopRecording();
00233 return true;
00234 }
00235 }
00236
00237 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(cardid);
00238 strlist << "STOP_RECORDING";
00239
00240 if (!gContext->SendReceiveStringList(strlist) || strlist.empty())
00241 return false;
00242
00243 return strlist[0].upper() == "OK";
00244 }
00245
00246 bool RemoteDeleteRecording(ProgramInfo *pginfo, bool forgetHistory,
00247 bool forceMetadataDelete)
00248 {
00249 bool result = true;
00250 QStringList strlist;
00251
00252 if (forceMetadataDelete)
00253 strlist = QString("FORCE_DELETE_RECORDING");
00254 else
00255 strlist = QString("DELETE_RECORDING");
00256 pginfo->ToStringList(strlist);
00257
00258 gContext->SendReceiveStringList(strlist);
00259
00260 if (strlist[0].toInt() == -2)
00261 result = false;
00262
00263 if (forgetHistory)
00264 {
00265 strlist = QString("FORGET_RECORDING");
00266 pginfo->ToStringList(strlist);
00267
00268 gContext->SendReceiveStringList(strlist);
00269 }
00270
00271 return result;
00272 }
00273
00274 bool RemoteUndeleteRecording(ProgramInfo *pginfo)
00275 {
00276 bool result = false;
00277
00278 bool undelete_possible =
00279 gContext->GetNumSetting("AutoExpireInsteadOfDelete", 0);
00280
00281 if (!undelete_possible)
00282 return result;
00283
00284 QStringList strlist;
00285
00286 strlist = QString("UNDELETE_RECORDING");
00287 pginfo->ToStringList(strlist);
00288
00289 gContext->SendReceiveStringList(strlist);
00290
00291 if (strlist[0].toInt() == 0)
00292 result = true;
00293
00294 return result;
00295 }
00296
00297 void RemoteGetAllScheduledRecordings(vector<ProgramInfo *> &scheduledlist)
00298 {
00299 QStringList strList = QString("QUERY_GETALLSCHEDULED");
00300 RemoteGetRecordingList(&scheduledlist, strList);
00301 }
00302
00303 void RemoteGetAllExpiringRecordings(vector<ProgramInfo *> &expiringlist)
00304 {
00305 QStringList strList = QString("QUERY_GETEXPIRING");
00306 RemoteGetRecordingList(&expiringlist, strList);
00307 }
00308
00309 int RemoteGetRecordingList(vector<ProgramInfo *> *reclist, QStringList &strList)
00310 {
00311 if (!gContext->SendReceiveStringList(strList))
00312 return 0;
00313
00314 int numrecordings = strList[0].toInt();
00315
00316 if (numrecordings > 0)
00317 {
00318 if (numrecordings * NUMPROGRAMLINES + 1 > (int)strList.size())
00319 {
00320 cerr << "length mismatch between programinfo\n";
00321 return 0;
00322 }
00323
00324 QStringList::const_iterator it = strList.at(1);
00325 for (int i = 0; i < numrecordings; i++)
00326 {
00327 ProgramInfo *pginfo = new ProgramInfo();
00328 pginfo->FromStringList(it, strList.end());
00329 reclist->push_back(pginfo);
00330 }
00331 }
00332
00333 return numrecordings;
00334 }
00335
00336 vector<ProgramInfo *> *RemoteGetConflictList(ProgramInfo *pginfo)
00337 {
00338 QString cmd = QString("QUERY_GETCONFLICTING");
00339 QStringList strlist = cmd;
00340 pginfo->ToStringList(strlist);
00341
00342 vector<ProgramInfo *> *retlist = new vector<ProgramInfo *>;
00343
00344 RemoteGetRecordingList(retlist, strlist);
00345 return retlist;
00346 }
00347
00348 RemoteEncoder *RemoteRequestNextFreeRecorder(int curr)
00349 {
00350 QStringList strlist = "GET_NEXT_FREE_RECORDER";
00351 strlist << QString("%1").arg(curr);
00352
00353 if (!gContext->SendReceiveStringList(strlist, true))
00354 return NULL;
00355
00356 int num = strlist[0].toInt();
00357 QString hostname = strlist[1];
00358 int port = strlist[2].toInt();
00359
00360 return new RemoteEncoder(num, hostname, port);
00361 }
00362
00363
00364
00365 RemoteEncoder *RemoteRequestFreeRecorderFromList(QStringList &qualifiedRecorders)
00366 {
00367 QStringList strlist = "GET_FREE_RECORDER_LIST";
00368
00369 if (!gContext->SendReceiveStringList(strlist, true))
00370 return NULL;
00371
00372 for (QStringList::iterator recIter = qualifiedRecorders.begin();
00373 recIter != qualifiedRecorders.end(); ++recIter)
00374 {
00375 if (strlist.find(*recIter) == strlist.end())
00376 {
00377
00378
00379 continue;
00380 }
00381
00382 return RemoteGetExistingRecorder((*recIter).toInt());
00383 }
00384
00385 return NULL;
00386 }
00387
00388 RemoteEncoder *RemoteRequestRecorder(void)
00389 {
00390 QStringList strlist = "GET_FREE_RECORDER";
00391
00392 if (!gContext->SendReceiveStringList(strlist, true))
00393 return NULL;
00394
00395 int num = strlist[0].toInt();
00396 QString hostname = strlist[1];
00397 int port = strlist[2].toInt();
00398
00399 return new RemoteEncoder(num, hostname, port);
00400 }
00401
00402 RemoteEncoder *RemoteGetExistingRecorder(ProgramInfo *pginfo)
00403 {
00404 QStringList strlist = "GET_RECORDER_NUM";
00405 pginfo->ToStringList(strlist);
00406
00407 if (!gContext->SendReceiveStringList(strlist))
00408 return NULL;
00409
00410 int num = strlist[0].toInt();
00411 QString hostname = strlist[1];
00412 int port = strlist[2].toInt();
00413
00414 return new RemoteEncoder(num, hostname, port);
00415 }
00416
00417 RemoteEncoder *RemoteGetExistingRecorder(int recordernum)
00418 {
00419 QStringList strlist = "GET_RECORDER_FROM_NUM";
00420 strlist << QString("%1").arg(recordernum);
00421
00422 if (!gContext->SendReceiveStringList(strlist))
00423 return NULL;
00424
00425 QString hostname = strlist[0];
00426 int port = strlist[1].toInt();
00427
00428 return new RemoteEncoder(recordernum, hostname, port);
00429 }
00430
00431 vector<uint> RemoteRequestFreeRecorderList(void)
00432 {
00433 vector<uint> list;
00434
00435 QStringList strlist = "GET_FREE_RECORDER_LIST";
00436
00437 if (!gContext->SendReceiveStringList(strlist, true))
00438 return list;
00439
00440 QStringList::const_iterator it = strlist.begin();
00441 for (; it != strlist.end(); ++it)
00442 list.push_back((*it).toUInt());
00443
00444 return list;
00445 }
00446
00447 vector<InputInfo> RemoteRequestFreeInputList(uint cardid,
00448 vector<uint> excluded_cardids)
00449 {
00450 vector<InputInfo> list;
00451
00452 QStringList strlist = QString("QUERY_RECORDER %1").arg(cardid);
00453 strlist << "GET_FREE_INPUTS";
00454 for (uint i = 0; i < excluded_cardids.size(); i++)
00455 strlist << QString::number(excluded_cardids[i]);
00456
00457 if (!gContext->SendReceiveStringList(strlist))
00458 return list;
00459
00460 QStringList::const_iterator it = strlist.begin();
00461 if ((it == strlist.end()) || (*it == "EMPTY_LIST"))
00462 return list;
00463
00464 while (it != strlist.end())
00465 {
00466 InputInfo info;
00467 if (!info.FromStringList(it, strlist.end()))
00468 break;
00469 list.push_back(info);
00470 }
00471
00472 return list;
00473 }
00474
00475 InputInfo RemoteRequestBusyInputID(uint cardid)
00476 {
00477 InputInfo blank;
00478
00479 QStringList strlist = QString("QUERY_RECORDER %1").arg(cardid);
00480 strlist << "GET_BUSY_INPUT";
00481
00482 if (!gContext->SendReceiveStringList(strlist))
00483 return blank;
00484
00485 QStringList::const_iterator it = strlist.begin();
00486 if ((it == strlist.end()) || (*it == "EMPTY_LIST"))
00487 return blank;
00488
00489 InputInfo info;
00490 if (info.FromStringList(it, strlist.end()))
00491 return info;
00492
00493 return blank;
00494 }
00495
00496 void RemoteCancelNextRecording(uint cardid, bool cancel)
00497 {
00498 QStringList strlist = QString("QUERY_RECORDER %1").arg(cardid);
00499 strlist << "CANCEL_NEXT_RECORDING";
00500 strlist << QString::number((cancel) ? 1 : 0);
00501
00502 gContext->SendReceiveStringList(strlist);
00503 }
00504
00505 void RemoteSendMessage(const QString &message)
00506 {
00507 QStringList strlist = "MESSAGE";
00508 strlist << message;
00509
00510 gContext->SendReceiveStringList(strlist);
00511 }
00512
00513 void RemoteGeneratePreviewPixmap(ProgramInfo *pginfo)
00514 {
00515 QStringList strlist = "QUERY_GENPIXMAP";
00516 pginfo->ToStringList(strlist);
00517
00518 gContext->SendReceiveStringList(strlist);
00519 }
00520
00521 QDateTime RemoteGetPreviewLastModified(ProgramInfo *pginfo)
00522 {
00523 QDateTime retdatetime;
00524
00525 QStringList strlist = "QUERY_PIXMAP_LASTMODIFIED";
00526 pginfo->ToStringList(strlist);
00527
00528 if (!gContext->SendReceiveStringList(strlist))
00529 return retdatetime;
00530
00531 if (!strlist.empty() && strlist[0] != "BAD")
00532 {
00533 uint timet = strlist[0].toUInt();
00534 retdatetime.setTime_t(timet);
00535 }
00536
00537 return retdatetime;
00538 }
00539
00540 void RemoteFillProginfo(ProgramInfo *pginfo, const QString &playbackhostname)
00541 {
00542 QStringList strlist = "FILL_PROGRAM_INFO";
00543 strlist << playbackhostname;
00544 pginfo->ToStringList(strlist);
00545
00546 if (gContext->SendReceiveStringList(strlist))
00547 pginfo->FromStringList(strlist, 0);
00548 }
00549
00550 bool RemoteIsBusy(uint cardid, TunedInputInfo &busy_input)
00551 {
00552
00553
00554
00555 busy_input.Clear();
00556
00557 if (gContext->IsBackend())
00558 {
00559 const TVRec *rec = TVRec::GetTVRec(cardid);
00560 if (rec)
00561 return rec->IsBusy(&busy_input);
00562 }
00563
00564 QStringList strlist = QString("QUERY_REMOTEENCODER %1").arg(cardid);
00565 strlist << "IS_BUSY";
00566 if (!gContext->SendReceiveStringList(strlist) || strlist.empty())
00567 return true;
00568
00569 QStringList::const_iterator it = strlist.begin();
00570 bool state = (*it).toInt();
00571 it++;
00572 busy_input.FromStringList(it, strlist.end());
00573
00574 return state;
00575 }
00576
00577 QStringList RemoteRecordings(void)
00578 {
00579 QStringList strlist = "QUERY_ISRECORDING";
00580 QStringList empty;
00581
00582 empty << "0" << "0";
00583
00584 if (!gContext->SendReceiveStringList(strlist, false, false))
00585 return empty;
00586
00587 return strlist;
00588 }
00589
00590 int RemoteGetRecordingMask(void)
00591 {
00592 int mask = 0;
00593
00594 QString cmd = "QUERY_ISRECORDING";
00595
00596 QStringList strlist = cmd;
00597
00598 if (!gContext->SendReceiveStringList(strlist))
00599 return mask;
00600
00601 int recCount = strlist[0].toInt();
00602
00603 for (int i = 0, j = 0; j < recCount; i++)
00604 {
00605 cmd = QString("QUERY_RECORDER %1").arg(i + 1);
00606
00607 strlist = cmd;
00608 strlist << "IS_RECORDING";
00609
00610 if (gContext->SendReceiveStringList(strlist))
00611 {
00612 if (strlist[0].toInt())
00613 {
00614 mask |= 1<<i;
00615 j++;
00616 }
00617 }
00618 }
00619
00620 return mask;
00621 }
00622
00623 int RemoteGetFreeRecorderCount(void)
00624 {
00625 QStringList strlist = "GET_FREE_RECORDER_COUNT";
00626
00627 if (!gContext->SendReceiveStringList(strlist, true))
00628 return 0;
00629
00630 if (strlist[0] == "UNKNOWN_COMMAND")
00631 {
00632 cerr << "Unknown command GET_FREE_RECORDER_COUNT, upgrade "
00633 "your backend version." << endl;
00634 return 0;
00635 }
00636
00637 return strlist[0].toInt();
00638 }
00639
00640 int RemoteCheckForRecording(ProgramInfo *pginfo)
00641 {
00642 QStringList strlist = QString("CHECK_RECORDING");
00643 pginfo->ToStringList(strlist);
00644
00645 gContext->SendReceiveStringList(strlist);
00646
00647 return strlist[0].toInt();
00648 }
00649
00650 int RemoteGetRecordingStatus(ProgramInfo *pginfo, int overrecsecs,
00651 int underrecsecs)
00652 {
00653 QDateTime curtime = QDateTime::currentDateTime();
00654
00655 int retval = 0;
00656
00657 if (pginfo)
00658 {
00659 if (curtime >= pginfo->startts.addSecs(-underrecsecs) &&
00660 curtime < pginfo->endts.addSecs(overrecsecs))
00661 {
00662 if (curtime >= pginfo->startts && curtime < pginfo->endts)
00663 retval = 1;
00664 else if (curtime < pginfo->startts &&
00665 RemoteCheckForRecording(pginfo) > 0)
00666 retval = 2;
00667 else if (curtime > pginfo->endts &&
00668 RemoteCheckForRecording(pginfo) > 0)
00669 retval = 3;
00670 }
00671 }
00672
00673 return retval;
00674 }
00675
00676 bool RemoteGetRecordingStatus(
00677 QPtrList<TunerStatus> *tunerList, bool list_inactive)
00678 {
00679 bool isRecording = false;
00680 vector<uint> cardlist = CardUtil::GetCardList();
00681
00682 if (tunerList)
00683 tunerList->clear();
00684
00685 for (uint i = 0; i < cardlist.size(); i++)
00686 {
00687 QString status = "";
00688 uint cardid = cardlist[i];
00689 int state = kState_ChangingState;
00690 QString channelName = "";
00691 QString title = "";
00692 QString subtitle = "";
00693 QDateTime dtStart = QDateTime();
00694 QDateTime dtEnd = QDateTime();
00695 QStringList strlist;
00696
00697 QString cmd = QString("QUERY_REMOTEENCODER %1").arg(cardid);
00698
00699 while (state == kState_ChangingState)
00700 {
00701 strlist = cmd;
00702 strlist << "GET_STATE";
00703 gContext->SendReceiveStringList(strlist);
00704
00705 if (strlist.empty())
00706 break;
00707
00708 state = strlist[0].toInt();
00709 if (kState_ChangingState == state)
00710 usleep(5000);
00711 }
00712
00713 if (kState_RecordingOnly == state || kState_WatchingRecording == state)
00714 {
00715 isRecording |= true;
00716
00717 if (!tunerList)
00718 break;
00719
00720 strlist = QString("QUERY_RECORDER %1").arg(cardid);
00721 strlist << "GET_RECORDING";
00722 gContext->SendReceiveStringList(strlist);
00723
00724 ProgramInfo progInfo;
00725 QStringList::const_iterator it = strlist.constBegin();
00726 progInfo.FromStringList(it, strlist.constEnd());
00727
00728 title = progInfo.title;
00729 subtitle = progInfo.subtitle;
00730 channelName = progInfo.channame;
00731 dtStart = progInfo.startts;
00732 dtEnd = progInfo.endts;
00733 }
00734 else if (!list_inactive)
00735 continue;
00736
00737 if (tunerList)
00738 {
00739 TunerStatus *tuner = new TunerStatus;
00740 tuner->id = cardid;
00741 tuner->isRecording = ((kState_RecordingOnly == state) ||
00742 (kState_WatchingRecording == state));
00743 tuner->channame = channelName;
00744 tuner->title = (kState_ChangingState == state) ?
00745 QObject::tr("Error querying recorder state") : title;
00746 tuner->subtitle = subtitle;
00747 tuner->startTime = dtStart;
00748 tuner->endTime = dtEnd;
00749 tunerList->append(tuner);
00750 }
00751 }
00752
00753 return isRecording;
00754 }
00755
00756
00757
00758
00759
00760 vector<ProgramInfo *> *RemoteGetCurrentlyRecordingList(void)
00761 {
00762 QString str = "QUERY_RECORDINGS ";
00763 str += "Recording";
00764 QStringList strlist = str;
00765
00766 vector<ProgramInfo *> *reclist = new vector<ProgramInfo *>;
00767 vector<ProgramInfo *> *info = new vector<ProgramInfo *>;
00768 if (!RemoteGetRecordingList(info, strlist))
00769 {
00770 if (info)
00771 delete info;
00772 return reclist;
00773 }
00774
00775 ProgramInfo *p = NULL;
00776 vector<ProgramInfo *>::iterator it = info->begin();
00777
00778
00779 for ( ; it != info->end(); it++)
00780 {
00781 p = *it;
00782 if (p->recstatus == rsRecording)
00783 reclist->push_back(new ProgramInfo(*p));
00784 }
00785
00786 if (info)
00787 delete info;
00788
00789 return reclist;
00790 }
00791