| 1 |  | 
| 2 |  | 
| 3 |   | 
| 4 |  | 
| 5 |  | 
| 6 |  | 
| 7 |  | 
| 8 |   | 
| 9 |  | 
| 10 |  | 
| 11 |  | 
| 12 |  | 
| 13 |   | 
| 14 |  | 
| 15 |  | 
| 16 |  | 
| 17 |  | 
| 18 |   | 
| 19 |  | 
| 20 |   | 
| 21 |  | 
| 22 |  | 
| 23 |   | 
| 24 | #include <string> | 
| 25 | #include "pending_notifications.h" | 
| 26 | #include "epgsearchtools.h" | 
| 27 |   | 
| 28 |   | 
| 29 | cPendingNotifications PendingNotifications; | 
| 30 | char *cPendingNotification::buffer = NULL__null; | 
| 31 |  | 
| 32 |   | 
| 33 | cPendingNotification::~cPendingNotification(void) | 
| 34 | { | 
| 35 |     if (buffer) { | 
| 36 | 	free(buffer); | 
| 37 | 	buffer = NULL__null; | 
| 38 |     } | 
| 39 | } | 
| 40 | bool cPendingNotification::Parse(const char *s) | 
| 41 | { | 
| 42 |     char *t = skipspace(s + 1); | 
| 43 |     switch (*s) { | 
 | 17  |  | Control jumps to 'case 70:'  at line 44 |  |  
  | 
| 44 | 	case 'F': strreplace(t, '|', '\n'); | 
| 45 | 	    formatted = strdup(t); | 
 |  | 
| 46 | 	    break; | 
 | 19  |  |  Execution continues on line 50 |  |  
  | 
| 47 | 	default:  LogFile.eSysLog("ERROR: unexpected tag while reading epgsearch pending notifications data: %s", s); | 
| 48 | 	    return false; | 
| 49 |     } | 
| 50 |   return true; | 
 |  | 
| 51 | } | 
| 52 |   | 
| 53 | bool cPendingNotification::Read(FILE *f) | 
| 54 | { | 
| 55 |     cPendingNotification *p = NULL__null; | 
| 56 |     char *s; | 
| 57 |     cReadLine ReadLine; | 
| 58 |     while ((s = ReadLine.Read(f)) != NULL__null) { | 
 | 7  |  | Loop condition is true.  Entering loop body |  |  
  | 
 | 14  |  | Loop condition is true.  Entering loop body |  |  
  | 
| 59 | 	char *t = skipspace(s + 1); | 
| 60 | 	switch (*s) { | 
 | 8  |  | Control jumps to 'case 78:'  at line 61 |  |  
  | 
 | 15  |  | Control jumps to the 'default' case at line 103 |  |  
  | 
| 61 | 	    case 'N': if (!p) { | 
 |  | 
| 62 | 		tEventID EventID; | 
| 63 | 		int Type, TimerMod, SearchID; | 
| 64 | 		time_t Start; | 
| 65 | 		int n = sscanf(t, "%d %u %d %d %ld", &Type, &EventID, &TimerMod, &SearchID, &Start); | 
| 66 | 		if (n == 5) { | 
 | 10  |  | Assuming 'n' is equal to 5 |  |  
  | 
 |  | 
| 67 | 		    p = new cPendingNotification; | 
| 68 | 		    if (p) | 
 |  | 
| 69 | 		    { | 
| 70 | 		        p->type = Type; | 
| 71 | 			p->eventID = EventID; | 
| 72 | 			p->timerMod = TimerMod; | 
| 73 | 			p->searchID = SearchID; | 
| 74 | 			p->start = Start; | 
| 75 |   | 
| 76 | 			PendingNotifications.Add(p); | 
| 77 | 		    } | 
| 78 | 		} | 
| 79 | 	    } | 
| 80 | 		break; | 
 | 13  |  |  Execution continues on line 58 |  |  
  | 
| 81 | 	    case 'C': | 
| 82 | 	    { | 
| 83 | 		s = skipspace(s + 1); | 
| 84 | 		char *pC = strchr(s, ' '); | 
| 85 | 		if (pC) | 
| 86 | 		    *pC = 0;  | 
| 87 | 		if (*s) { | 
| 88 | 		    tChannelID channelID = tChannelID::FromString(s); | 
| 89 | 		    if (channelID.Valid()) { | 
| 90 | 			if (p) | 
| 91 | 			    p->channelID = channelID; | 
| 92 |                     } | 
| 93 | 		    else { | 
| 94 | 			LogFile.Log(3, "ERROR: illegal channel ID: %s", s); | 
| 95 | 			return false; | 
| 96 |                     } | 
| 97 | 		} | 
| 98 | 	    } | 
| 99 | 	    break; | 
| 100 | 	    case 'n': | 
| 101 | 		p = NULL__null; | 
| 102 | 		break; | 
| 103 | 	    default:  if (p && !p->Parse(s)) | 
 | 16  |  | Calling 'cPendingNotification::Parse' |  |  
  | 
| 104 | 	    { | 
| 105 | 		LogFile.Log(1,"ERROR: parsing %s", s); | 
| 106 | 		return false; | 
| 107 | 	    } | 
| 108 | 	} | 
| 109 |     } | 
| 110 |     return true; | 
| 111 | } | 
| 112 |   | 
| 113 |   | 
| 114 | const char *cPendingNotification::ToText(void) const | 
| 115 | { | 
| 116 |   char* tmpFormatted = formatted!=""?strdup(formatted.c_str()):NULL__null; | 
| 117 |     if (tmpFormatted) | 
| 118 | 	strreplace(tmpFormatted, '\n', '|'); | 
| 119 |   | 
| 120 |     if (buffer) | 
| 121 | 	free(buffer); | 
| 122 |     buffer = NULL__null; | 
| 123 |   | 
| 124 |     cChannel *channel = Channels.GetByChannelID(channelID, true, true); | 
| 125 |     if (!channel) | 
| 126 | 	LogFile.Log(3,"invalid channel in pending notifications!"); | 
| 127 |   | 
| 128 |     msprintf(&buffer, "N %d %u %d %d %ld\nC %s\n%s%s%sn", | 
| 129 | 	     type, eventID, timerMod, searchID, start, | 
| 130 | 	     channel?CHANNELSTRING(channel)(*channel->GetChannelID().ToString()):"", | 
| 131 | 	     tmpFormatted?"F ":"",tmpFormatted?tmpFormatted:"", tmpFormatted?"\n":""); | 
| 132 |   | 
| 133 |     if (tmpFormatted) | 
| 134 | 	free(tmpFormatted); | 
| 135 |   | 
| 136 |     return buffer; | 
| 137 | } | 
| 138 |   | 
| 139 | bool cPendingNotification::Save(FILE *f) | 
| 140 | { | 
| 141 |     return fprintf(f, "%s\n", ToText()) > 0; | 
| 142 | } | 
| 143 |   | 
| 144 | bool cPendingNotifications::Load(const char *FileName) | 
| 145 | { | 
| 146 |     Clear(); | 
| 147 |     if (FileName) { | 
 | 1  | Assuming 'FileName' is null |  |  
  | 
 |  | 
| 148 | 	free(fileName); | 
| 149 | 	fileName = strdup(FileName); | 
| 150 |     } | 
| 151 |   | 
| 152 |     if (fileName && access(fileName, F_OK0) == 0) { | 
 |  | 
| 153 | 	LogFile.iSysLog("loading %s", fileName); | 
| 154 | 	FILE *f = fopen(fileName, "r"); | 
| 155 | 	bool result = false; | 
| 156 | 	if (f) { | 
 | 4  |  | Assuming 'f' is non-null |  |  
  | 
 |  | 
| 157 | 	    result = cPendingNotification::Read(f); | 
 | 6  |  | Calling 'cPendingNotification::Read' |  |  
  | 
| 158 | 	    fclose(f); | 
| 159 | 	} | 
| 160 | 	if (result) | 
| 161 | 	    LogFile.Log(2,"loaded pending notifications from %s (count: %d)", fileName, Count()); | 
| 162 | 	else | 
| 163 | 	    LogFile.Log(1,"error loading pending notifications from %s (count: %d)", fileName, Count()); | 
| 164 | 	return result; | 
| 165 |     } | 
| 166 |     return false; | 
| 167 | } | 
| 168 |   | 
| 169 | bool cPendingNotifications::Save(void) | 
| 170 | { | 
| 171 |     bool result = true; | 
| 172 |     cPendingNotification* l = (cPendingNotification*)this->First(); | 
| 173 |     cSafeFile f(fileName); | 
| 174 |     if (f.Open()) { | 
| 175 | 	while (l) { | 
| 176 | 	    if (!l->Save(f)) { | 
| 177 |                 result = false; | 
| 178 |                 break; | 
| 179 | 	    } | 
| 180 | 	    l = (cPendingNotification*)l->Next(); | 
| 181 | 	} | 
| 182 | 	if (!f.Close()) | 
| 183 | 	    result = false; | 
| 184 |     } | 
| 185 |     else | 
| 186 | 	result = false; | 
| 187 |     LogFile.Log(2,"saved pending notifications (count: %d)", Count()); | 
| 188 |     return result; | 
| 189 | } | 
| 190 |   | 
| 191 |   |