Beispiel #1
0
MyXmlTag *MyXmlDoc::getTagByName(QString name)
{
   MyXmlTag *tag=NULL;
   qint32 level, index;
   QString subnode;

   if(!m_root) return tag;

   level=0;
   while(1)
   {
      subnode=extractNode(name,level,index);
      if(subnode=="") break;
      if(tag) tag=tag->getChild(); else tag=m_root;

      while(1)
      {
         if(tag->getName()==subnode) index--;
         if(index<0) break;

         if(tag->getNext())
            tag=tag->getNext();
         else
            return NULL;
      }
      level++;
   }
   return tag;
}
 TreeNode * extractNode(string & s){
     if(s.length()==0) return NULL;
     size_t comma_pos = s.find_first_of(",");
     if(comma_pos==string::npos) {
         // the only node
         if(s == "#") return NULL; // mistake: [1] => 1,#,#
         return new TreeNode(stoi(s));
     }
     string cur = s.substr(0, comma_pos);
     s = s.substr(comma_pos+1);
     if(cur == "#") return NULL;
     TreeNode * root = new TreeNode(stoi(cur));
     root->left = extractNode(s);
     root->right = extractNode(s);
     return root;
 }
Beispiel #3
0
// my_response is used to handle a reply
static enum ccn_upcall_res
my_response(struct ccn_closure *selfp,
            enum ccn_upcall_kind kind,
            struct ccn_upcall_info *info) {
    static char *here = "sync_track.my_response";
    enum ccn_upcall_res ret = CCN_UPCALL_RESULT_ERR;
    switch (kind) {
        case CCN_UPCALL_FINAL:
            free(selfp);
            ret = CCN_UPCALL_RESULT_OK;
            break;
        case CCN_UPCALL_CONTENT_UNVERIFIED:
            ret = CCN_UPCALL_RESULT_VERIFY;
            break;
        case CCN_UPCALL_CONTENT_KEYMISSING:
            ret = CCN_UPCALL_RESULT_FETCHKEY;
            break;
        case CCN_UPCALL_INTEREST_TIMED_OUT: {
            struct sync_diff_fetch_data *fd = selfp->data;
            //enum local_flags flags = selfp->intdata;
            if (fd == NULL) break;
            struct sync_diff_data *diff_data = fd->diff_data;
            if (diff_data == NULL) break;
            struct ccns_handle *ch = diff_data->client_data;
            free_fetch_data(ch, fd);
            start_round(ch, 10);
            ret = CCN_UPCALL_RESULT_OK;
            break;
        }
        case CCN_UPCALL_CONTENT_RAW:
        case CCN_UPCALL_CONTENT: {
            struct sync_diff_fetch_data *fd = selfp->data;
            enum local_flags flags = selfp->intdata;
            if (fd == NULL) break;
            struct sync_diff_data *diff_data = fd->diff_data;
            if (diff_data == NULL) break;
            struct SyncRootStruct *root = diff_data->root;
            if (root == NULL) break;
            struct ccns_handle *ch = diff_data->client_data;
            struct SyncNodeComposite *nc = extractNode(root, info);
            if (ch->debug >= CCNL_FINE) {
                char fs[1024];
                int pos = 0;
                switch (flags) {
                    case LF_NULL: 
                        pos += snprintf(fs+pos, sizeof(fs)-pos, "null");
                        break;
                    case LF_ADVISE:
                        pos += snprintf(fs+pos, sizeof(fs)-pos, "advise");
                        break;
                    case LF_NODE:
                        pos += snprintf(fs+pos, sizeof(fs)-pos, "node");
                        break;
                    default: 
                        pos += snprintf(fs+pos, sizeof(fs)-pos, "??%d", flags);
                        break;
                }
                if (nc != NULL)
                    pos += snprintf(fs+pos, sizeof(fs)-pos, ", nc OK");
                struct ccn_charbuf *nm = SyncNameForIndexbuf(info->content_ccnb,
                                                             info->content_comps);
                struct ccn_charbuf *uri = SyncUriForName(nm);
                pos += snprintf(fs+pos, sizeof(fs)-pos, ", %s", ccn_charbuf_as_string(uri));
                SyncNoteSimple(diff_data->root, here, fs);
                ccn_charbuf_destroy(&nm);
                ccn_charbuf_destroy(&uri);
            }
            if (nc != NULL) {
                // the node exists, so store it
                // TBD: check the hash?
                struct ccns_handle *ch = diff_data->client_data;
                struct SyncHashCacheEntry *ce = SyncHashEnter(root->ch,
                                                              nc->hash->buf, nc->hash->length,
                                                              SyncHashState_remote);
                if (flags == LF_ADVISE) {
                    ch->hashSeen = SyncNoteHash(ch->hashSeen, ce);
                    if (ch->next_ce == NULL)
                        // have to have an initial place to start
                        ch->next_ce = ce;
                }
                if (ce->ncR == NULL) {
                    // store the node
                    ce->ncR = nc;
                    SyncNodeIncRC(nc);
                } else {
                    // flush the node
                    SyncNodeDecRC(nc);
                    nc = NULL;
                }
                if (flags != LF_NULL) {
                    // from start_interest
                    start_round(ch, 10);
                } else {
                    // from sync_diff
                    sync_diff_note_node(diff_data, ce);
                }
                ret = CCN_UPCALL_RESULT_OK;
            }
            free_fetch_data(ch, fd);
            break;
        default:
            // SHOULD NOT HAPPEN
            break;
        }
    }
    return ret;
}
 // Decodes your encoded data to tree.
 TreeNode* deserialize(string data) {
     return extractNode(data);
 }
void SortedList<T, Pred>::moveNode(typename SortedList<T, Pred>::Node* to_move, typename SortedList<T, Pred>::Node* destination)
{
	insertAfterNode(extractNode(to_move), destination);
}