25int PhoneHome::allThinning = 50;
26int PhoneHome::ourNumber = -1;
28bool PhoneHome::ourEnableCompletionStatus =
false;
29std::string PhoneHome::ourBaseURL =
"http://csgph.sph.umich.edu/ph/";
30std::string PhoneHome::ourURL = ourBaseURL;
31char PhoneHome::ourPrefixChar =
'?';
32String PhoneHome::ourReturnString =
"";
33String PhoneHome::ourToolName =
"";
35void PhoneHome::enableCompletionStatus(
const char* programName)
37 if(programName != NULL)
39 add(
"pgm", programName);
41 ourEnableCompletionStatus =
true;
45void PhoneHome::disableCompletionStatus()
47 ourEnableCompletionStatus =
false;
51bool PhoneHome::checkVersion(
const char* programName,
const char* version,
54 enableCompletionStatus();
55 add(
"pgm", programName);
62 int start = ourReturnString.Find(ourToolName+
"\t");
67 int colStart = ourToolName.FastFindChar(
':');
70 ourToolName.SetLength(colStart);
71 start = ourReturnString.Find(ourToolName+
"\t");
84 start += ourToolName.Length();
85 while((start < ourReturnString.Length()) &&
86 isspace(ourReturnString[start]))
93 String thisVersion = version;
96 while((end < ourReturnString.Length()) &&
97 !isspace(ourReturnString[end]))
99 latestVersion += ourReturnString[end];
105 if(latestVersion.FastCompare(thisVersion) > 0)
107 std::cerr <<
"\n**************************************************************************************\n"
108 <<
"A new version, " << latestVersion
109 <<
", of " << ourToolName
110 <<
" is available (currently running "
111 << thisVersion.c_str() <<
")"
112 <<
"\n**************************************************************************************\n\n";
118void PhoneHome::completionStatus(
const char* status,
const char* programName)
120 if(programName != NULL)
122 add(
"pgm", programName);
123 enableCompletionStatus();
125 if(ourEnableCompletionStatus)
127 add(
"status", status);
133void PhoneHome::resetURL()
140void PhoneHome::add(
const char* name,
const char* val)
142 if((name != NULL) && (strlen(name) != 0) &&
143 (val != NULL) && (strlen(val) != 0))
146 if(ourURL.find(name) != std::string::npos)
153 ourURL += ourPrefixChar;
157 if(strstr(name,
"pgm") != NULL)
160 const char* toolVal = strrchr(val,
'/');
169 ourURL.append(toolVal);
170 ourToolName = toolVal;
181bool PhoneHome::connect()
188 numString = ourNumber;
190 thinningString = allThinning;
191 add(
"uniqNum", numString);
192 add(
"thinning", thinningString);
194 if((ourNumber % 100) >= allThinning)
201 ourReturnString.Clear();
205 knetFile *file = knet_open(ourURL.c_str(),
"r");
206 if (file == 0)
return(
false);
208 const int BUF_SIZE = 100;
211 ssize_t readLen = BUF_SIZE-1;
212 ssize_t numRead = readLen;
213 while(numRead == readLen)
215 numRead = knet_read(file, buf, readLen);
217 ourReturnString += buf;