//////////////////////////////////////////////////////////////////////////////// // Support FF2, FF3. // Thankfully FF1 is no longer supported. void Task::legacyParse (const std::string& line) { switch (determineVersion (line)) { // File format version 1, from 2006.11.27 - 2007.12.31 case 1: throw std::string (STRING_TASK_NO_FF1); break; // File format version 2, from 2008.1.1 - 2009.3.23 case 2: { if (line.length () > 46) // ^.{36} . \[\] \[\] \n { set ("uuid", line.substr (0, 36)); Task::status status = line[37] == '+' ? completed : line[37] == 'X' ? deleted : line[37] == 'r' ? recurring : pending; set ("status", statusToText (status)); size_t openTagBracket = line.find ("["); size_t closeTagBracket = line.find ("]", openTagBracket); if (openTagBracket != std::string::npos && closeTagBracket != std::string::npos) { size_t openAttrBracket = line.find ("[", closeTagBracket); size_t closeAttrBracket = line.find ("]", openAttrBracket); if (openAttrBracket != std::string::npos && closeAttrBracket != std::string::npos) { std::string tags = line.substr ( openTagBracket + 1, closeTagBracket - openTagBracket - 1); std::vector <std::string> tagSet; split (tagSet, tags, ' '); addTags (tagSet); std::string attributes = line.substr ( openAttrBracket + 1, closeAttrBracket - openAttrBracket - 1); std::vector <std::string> pairs; split (pairs, attributes, ' '); for (size_t i = 0; i < pairs.size (); ++i) { std::vector <std::string> pair; split (pair, pairs[i], ':'); if (pair.size () == 2) set (pair[0], pair[1]); } set ("description", line.substr (closeAttrBracket + 2)); } else throw std::string (STRING_TASK_PARSE_ATT_BRACK); } else throw std::string (STRING_TASK_PARSE_TAG_BRACK); } else throw std::string (STRING_TASK_PARSE_TOO_SHORT); removeAnnotations (); } break; // File format version 3, from 2009.3.23 case 3: { if (line.length () > 49) // ^.{36} . \[\] \[\] \[\] \n { set ("uuid", line.substr (0, 36)); Task::status status = line[37] == '+' ? completed : line[37] == 'X' ? deleted : line[37] == 'r' ? recurring : pending; set ("status", statusToText (status)); size_t openTagBracket = line.find ("["); size_t closeTagBracket = line.find ("]", openTagBracket); if (openTagBracket != std::string::npos && closeTagBracket != std::string::npos) { size_t openAttrBracket = line.find ("[", closeTagBracket); size_t closeAttrBracket = line.find ("]", openAttrBracket); if (openAttrBracket != std::string::npos && closeAttrBracket != std::string::npos) { size_t openAnnoBracket = line.find ("[", closeAttrBracket); size_t closeAnnoBracket = line.find ("]", openAnnoBracket); if (openAnnoBracket != std::string::npos && closeAnnoBracket != std::string::npos) { std::string tags = line.substr ( openTagBracket + 1, closeTagBracket - openTagBracket - 1); std::vector <std::string> tagSet; split (tagSet, tags, ' '); addTags (tagSet); std::string attributes = line.substr ( openAttrBracket + 1, closeAttrBracket - openAttrBracket - 1); std::vector <std::string> pairs; split (pairs, attributes, ' '); for (size_t i = 0; i < pairs.size (); ++i) { std::vector <std::string> pair; split (pair, pairs[i], ':'); if (pair.size () == 2) set (pair[0], pair[1]); } // Extract and split the annotations, which are of the form: // 1234:"..." 5678:"..." std::string annotations = line.substr ( openAnnoBracket + 1, closeAnnoBracket - openAnnoBracket - 1); pairs.clear (); std::string::size_type start = 0; std::string::size_type end = 0; do { end = annotations.find ('"', start); if (end != std::string::npos) { end = annotations.find ('"', end + 1); if (start != std::string::npos && end != std::string::npos) { pairs.push_back (annotations.substr (start, end - start + 1)); start = end + 2; } } } while (start != std::string::npos && end != std::string::npos); for (size_t i = 0; i < pairs.size (); ++i) { std::string pair = pairs[i]; std::string::size_type colon = pair.find (":"); if (colon != std::string::npos) { std::string name = pair.substr (0, colon); std::string value = pair.substr (colon + 2, pair.length () - colon - 3); set ("annotation_" + name, value); ++annotation_count; } } set ("description", line.substr (closeAnnoBracket + 2)); } else throw std::string (STRING_TASK_PARSE_ANNO_BRACK); } else throw std::string (STRING_TASK_PARSE_ATT_BRACK); } else throw std::string (STRING_TASK_PARSE_TAG_BRACK); } else throw std::string (STRING_TASK_PARSE_TOO_SHORT); } break; default: throw std::string (STRING_TASK_PARSE_UNREC_FF); break; } recalc_urgency = true; }
int main(int argc, const char *argv[]) { char from[MAX_GROUP_NAME]; char message[MAX_MESSLEN]; membership_info memb_info; int num_groups; char target_groups[100][MAX_GROUP_NAME]; int16 mess_type; int endian_mismatch; int service_type; int loop = 1; int rc; int ret; int i; sqlite3 *mydb; char *dbName; char *zErrMsg; connectionStatus status = UNKNOWN; char buffer[MAX_GROUP_NAME]; char sqlBuffer[1024]; char *member; char *host; char *tok; char ch; extern char *optarg; char scratch[255]; global.connected=0; global.Group=(char *)NULL; global.configFileName=(char *)NULL; global.locked = 0; global.rawClient =1; global.debug = 0; #ifdef FICL global.appDir=(char *)NULL; #endif char *group=(char *)NULL; setSymbol("BUILD",__DATE__,LOCK,LOCAL); setSymbol("CLIENT","raw",UNLOCK,GLOBAL); setSymbol("SPREAD_SERVER","4803",UNLOCK,GLOBAL); setSymbol("GROUP","global",UNLOCK,GLOBAL); setSymbol("USER","dbCache",LOCK,GLOBAL); setSymbol("DEBUG","false",UNLOCK,GLOBAL); setSymbol("MODE","local",UNLOCK,GLOBAL); setSymbol("START_FILE","./dbCache.rc",UNLOCK,GLOBAL); while((ch = getopt(argc, ( char **)argv,"dhc:")) != -1) { switch(ch) { case 'c': setSymbol("START_FILE", optarg,LOCK,GLOBAL); break; case 'd': global.debug=1; break; case 'h': usage(); exit(0); break; } } loadFile(getSymbol("START_FILE")); if( global.debug ) { setBoolean("DEBUG",1); } global.debug = getBoolean("DEBUG"); if(global.debug) { dumpGlobals(); dumpSymbols(); } dbName = getSymbol("DATABASE"); connectToSpread(); while(loop) { status = UNKNOWN; ret = SP_receive(global.Mbox, &service_type, from, 100, &num_groups, target_groups, &mess_type, &endian_mismatch, sizeof(message), message); if (Is_membership_mess (service_type)) { ret = SP_get_memb_info(message, service_type, &memb_info); if (Is_caused_join_mess(service_type)) { status=JOINED; } if (Is_caused_leave_mess (service_type)) { status = LEFT; } if (Is_caused_disconnect_mess (service_type)) { status = DISCONNECTED; } if (Is_caused_network_mess (service_type)) { status = NETWORK; } rc = sqlite3_open(dbName, &mydb); for (i = 0; i < num_groups; i++) { if( global.debug) { printf("\t%s\n",(char *) &target_groups[i][0]); } strcpy(buffer, &target_groups[i][1]); member=strtok(buffer,"#"); host=strtok(NULL,"#"); if( global.debug) { printf("\t\tMember:%s\n", member); printf("\t\tHost :%s\n", host); } statusToText( status, scratch ); if (JOINED == status ) { sprintf( sqlBuffer,"insert or replace into status ( member, host, grp, state ) values ( '%s','%s','%s','%s');", member, host,from,scratch); } if( global.debug) { printf ("%s\n",sqlBuffer); } rc = sqlite3_exec(mydb, sqlBuffer, 0, 0, &zErrMsg); } strcpy(buffer, &memb_info.changed_member[1]); member=strtok(buffer,"#"); host=strtok(NULL,"#"); statusToText( status, scratch ); sprintf( sqlBuffer, "update status set state='%s' where member = '%s' and host ='%s';",scratch, member,host); if( global.debug) { printf("CHANGE: %s %s\n",member,host); printf("CHANGE: %s\n", scratch); printf ("%s\n",sqlBuffer); } rc = sqlite3_exec(mydb, sqlBuffer, 0, 0, &zErrMsg); sqlite3_close(mydb); } } printf("============ After\n"); dumpGlobals(); printf("Sender %s\n",from); printf("Message >%s<\n",message); toSpread(from,"Message recieved\n"); spreadJoin("TEST"); sleep(2); spreadLeave("TEST"); sleep(2); spreadDisconnect(); }
void Task::setStatus (Task::status status) { set ("status", statusToText (status)); recalc_urgency = true; }