static Upcall.ccn_upcall_res RequestCallback(IntPtr selfp, Upcall.ccn_upcall_kind kind, IntPtr info) { // this will be ran by a NON-Unity thread print("RequestCallback: " + kind); Egal.ccn_upcall_info Info = Egal.GetInfo(info); IntPtr h=Info.h; switch (kind) { case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT_UNVERIFIED: case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT: FirstAsteroidName = Egal.GetContentName(Info.content_ccnb); FirstAsteroid = Egal.GetContentValue(Info.content_ccnb, Info.pco); FirstAsteroidLabel = M.GetLabelFromName(FirstAsteroidName); break; case Upcall.ccn_upcall_kind.CCN_UPCALL_INTEREST_TIMED_OUT: print("Initialize: request first asteroid interest timed out."); break; case Upcall.ccn_upcall_kind.CCN_UPCALL_FINAL: Egal.ccn_set_run_timeout(h, 0); Egal.killCurrentThread(); // kill current thread break; } return Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_OK; }
static Upcall.ccn_upcall_res ReadCallback(IntPtr selfp, Upcall.ccn_upcall_kind kind, IntPtr info) { print("ReadCallback! " + kind); Upcall.ccn_upcall_res res = Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_OK; Egal.ccn_upcall_info Info = new Egal.ccn_upcall_info(); Info = (Egal.ccn_upcall_info)Marshal.PtrToStructure(info, typeof(Egal.ccn_upcall_info)); IntPtr h=Info.h; switch (kind) { case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT: //print("ReadCallback: CCN_UPCALL_CONTENT"); IntPtr source_ptr = Info.content_ccnb; Egal.ccn_parsed_ContentObject Pco = new Egal.ccn_parsed_ContentObject(); Pco = (Egal.ccn_parsed_ContentObject)Marshal.PtrToStructure(Info.content_ccnb, typeof(Egal.ccn_parsed_ContentObject)); UInt16 source_length = Pco.offset[(int)PCO.ccn_parsed_content_object_offsetid.CCN_PCO_E]; IntPtr result_ptr = IntPtr.Zero; int result_length = 0; Egal.ccn_content_get_value(source_ptr, source_length, Info.pco, ref result_ptr, ref result_length); String content = Marshal.PtrToStringAnsi(result_ptr); print(content); break; case Upcall.ccn_upcall_kind.CCN_UPCALL_FINAL: //print("ReadCallback: CCN_UPCALL_FINAL"); Egal.ccn_set_run_timeout(h, 0); break; default: break; } return res; }
static Upcall.ccn_upcall_res DiscoverFishCallback(IntPtr selfp, Upcall.ccn_upcall_kind kind, IntPtr info) { //print("Fish Callback: " + kind); Egal.ccn_upcall_info Info = Egal.GetInfo(info); IntPtr h=Info.h; switch (kind) { case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT_UNVERIFIED: case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT: string name = Egal.GetContentName(Info.content_ccnb); string content = Egal.GetContentValue(Info.content_ccnb, Info.pco); FishNameContBuf.Write (name, content); string labels = M.GetLabelFromName(name); string oldcomponent = M.GetIDFromName(name); if(labels == null || oldcomponent == null) { print("Ill name: " + name + ", belongs to: " + h); break; } if(Discovery.nimbus.Contains(labels)==false) // we don't care about this octant any more { print("don't care: " + h + ", " + labels); break; } IntPtr c = Egal.ccn_charbuf_create(); IntPtr templ = Egal.ccn_charbuf_create(); IntPtr comp = Egal.ccn_charbuf_create(); Egal.ccn_name_init(c); Egal.ccn_name_init(comp); string matchedprefix = M.GetNameTillID(name); string [] split = matchedprefix.Split(new char [] {'/'},StringSplitOptions.RemoveEmptyEntries); foreach(string s in split) { Egal.ccn_name_append_str(c, s); } Egal.ccn_charbuf_append_tt(templ, (int)Dtag.ccn_dtag.CCN_DTAG_Interest, (int)TT.ccn_tt.CCN_DTAG); Egal.ccn_charbuf_append_tt(templ, (int)Dtag.ccn_dtag.CCN_DTAG_Name, (int)TT.ccn_tt.CCN_DTAG); Egal.ccn_charbuf_append_closer(templ); // </Name> Egal.ccn_charbuf_append_tt(templ, (int)Dtag.ccn_dtag.CCN_DTAG_Exclude, (int)TT.ccn_tt.CCN_DTAG); Egal.ccn_closure Selfp = (Egal.ccn_closure)Marshal.PtrToStructure(selfp, typeof(Egal.ccn_closure)); M.Exclude Data = (M.Exclude) Marshal.PtrToStructure(Selfp.data, typeof(M.Exclude)); Data.filter = Data.filter + "," + oldcomponent; Marshal.StructureToPtr(Data, Selfp.data, true); Marshal.StructureToPtr(Selfp, selfp, true); string newfilterlist = Data.filter; string [] filters = newfilterlist.Split(new char [] {','},StringSplitOptions.RemoveEmptyEntries); foreach(string s in filters) { Egal.ccn_name_append_str(comp, s); } Egal.ccn_charbuf_append2(templ, comp); Egal.ccn_charbuf_append_closer(templ); // </Exclude> Egal.ccn_charbuf_append_closer(templ); // </Interest> // express interest again Handle.Pause(); Egal.ccn_express_interest(h,c,selfp,templ); Handle.Resume(); break; case Upcall.ccn_upcall_kind.CCN_UPCALL_FINAL: //print("CCN_UPCALL_FINAL: " + h); break; case Upcall.ccn_upcall_kind.CCN_UPCALL_INTEREST_TIMED_OUT: //print("CCN_UPCALL_INTEREST_TIMED_OUT: " + h); break; default: print("othercallback: " + kind); break; } return Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_OK; }
Upcall.ccn_upcall_res WriteCallback(IntPtr selfp, Upcall.ccn_upcall_kind kind, IntPtr info) { print("WriteCallback... " + kind); Upcall.ccn_upcall_res ret = Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_OK; Egal.ccn_upcall_info Info = new Egal.ccn_upcall_info(); Info = (Egal.ccn_upcall_info)Marshal.PtrToStructure(info, typeof(Egal.ccn_upcall_info)); IntPtr h = Info.h; Egal.ccn_closure Selfp = new Egal.ccn_closure(); Selfp = (Egal.ccn_closure)Marshal.PtrToStructure(selfp, typeof(Egal.ccn_closure)); NormalStruct Data = new NormalStruct(); Data = (NormalStruct) Marshal.PtrToStructure(Selfp.data, typeof(NormalStruct)); switch(kind) { case Upcall.ccn_upcall_kind.CCN_UPCALL_FINAL: // Marshal.FreeHGlobal(selfp); // this again, will make Unity crash break; case Upcall.ccn_upcall_kind.CCN_UPCALL_INTEREST: // print ("put content handle: " + h + ", content: " + Data.value); int res = PutContent(h, Data); if(res >= 0) { ret = Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_INTEREST_CONSUMED; Egal.ccn_set_run_timeout(h, 0); } else print("put content error"); break; case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT: // repo first returns a content... // this is info of the repo... break; default: ret = Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_ERR; break; } // print ("ref count: " + Selfp.refcount); // print ("WriteCallback returnning..." + ret); return ret; }