public bool CheckName(string firstName, LastName lastName) { if (Initializing) throw new InvalidOperationException("still initializing"); if (_caps.CheckName == null) throw new InvalidOperationException("access denied; only approved developers have access to the registration api"); // Create the POST data LLSDMap query = new LLSDMap(); query.Add("username", LLSD.FromString(firstName)); query.Add("last_name_id", LLSD.FromInteger(lastName.ID)); byte[] postData = LLSDParser.SerializeXmlBytes(query); CapsClient request = new CapsClient(_caps.CheckName); request.OnComplete += new CapsClient.CompleteCallback(CheckNameResponse); request.StartRequest(); // FIXME: return false; }
private void CheckNameResponse(CapsClient client, LLSD response, Exception error) { if (response.Type == LLSDType.Boolean) { // FIXME: //(bool)response; } else { // FIXME: } }
public void RequestCreateItemFromAsset(byte[] data, string name, string description, AssetType assetType, InventoryType invType, LLUUID folderID, ItemCreatedFromAssetCallback callback) { if (_Client.Network.CurrentSim == null || _Client.Network.CurrentSim.Caps == null) throw new Exception("NewFileAgentInventory capability is not currently available"); Uri url = _Client.Network.CurrentSim.Caps.CapabilityURI("NewFileAgentInventory"); if (url != null) { LLSDMap query = new LLSDMap(); query.Add("folder_id", LLSD.FromUUID(folderID)); query.Add("asset_type", LLSD.FromString(AssetTypeToString(assetType))); query.Add("inventory_type", LLSD.FromString(InventoryTypeToString(invType))); query.Add("name", LLSD.FromString(name)); query.Add("description", LLSD.FromString(description)); byte[] postData = StructuredData.LLSDParser.SerializeXmlBytes(query); // Make the request CapsClient request = new CapsClient(url); request.OnComplete += new CapsClient.CompleteCallback(CreateItemFromAssetResponse); request.UserData = new KeyValuePair<ItemCreatedFromAssetCallback, byte[]>(callback, data); request.StartRequest(postData); } else { throw new Exception("NewFileAgentInventory capability is not currently available"); } }
/// <summary> /// /// </summary> /// <param name="data"></param> /// <param name="notecardID"></param> /// <param name="callback"></param> public void RequestUploadNotecardAsset(byte[] data, LLUUID notecardID, NotecardUploadedAssetCallback callback) { if (_Client.Network.CurrentSim == null || _Client.Network.CurrentSim.Caps == null) throw new Exception("UpdateNotecardAgentInventory capability is not currently available"); Uri url = _Client.Network.CurrentSim.Caps.CapabilityURI("UpdateNotecardAgentInventory"); if (url != null) { LLSDMap query = new LLSDMap(); query.Add("item_id", LLSD.FromUUID(notecardID)); byte[] postData = StructuredData.LLSDParser.SerializeXmlBytes(query); // Make the request CapsClient request = new CapsClient(url); request.OnComplete += new CapsClient.CompleteCallback(UploadNotecardAssetResponse); request.UserData = new object[2] { new KeyValuePair<NotecardUploadedAssetCallback, byte[]>(callback, data), notecardID }; request.StartRequest(postData); } else { throw new Exception("UpdateNotecardAgentInventory capability is not currently available"); } }
private void BeginLogin() { LoginParams loginParams = CurrentContext.Value; // Sanity check if (loginParams.Options == null) loginParams.Options = new List<string>(); // Convert the password to MD5 if it isn't already if (loginParams.Password.Length != 35 && !loginParams.Password.StartsWith("$1$")) loginParams.Password = Helpers.MD5(loginParams.Password); // Override SSL authentication mechanisms. DO NOT convert this to the // .NET 2.0 preferred method, the equivalent function in Mono has a // different name and it will break compatibility! ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); // TODO: At some point, maybe we should check the cert? // Create the CAPS login structure LLSDMap loginLLSD = new LLSDMap(); loginLLSD["first"] = LLSD.FromString(loginParams.FirstName); loginLLSD["last"] = LLSD.FromString(loginParams.LastName); loginLLSD["passwd"] = LLSD.FromString(loginParams.Password); loginLLSD["start"] = LLSD.FromString(loginParams.Start); loginLLSD["channel"] = LLSD.FromString(loginParams.Channel); loginLLSD["version"] = LLSD.FromString(loginParams.Version); loginLLSD["platform"] = LLSD.FromString(loginParams.Platform); loginLLSD["mac"] = LLSD.FromString(loginParams.MAC); loginLLSD["agree_to_tos"] = LLSD.FromBoolean(true); loginLLSD["read_critical"] = LLSD.FromBoolean(true); loginLLSD["viewer_digest"] = LLSD.FromString(loginParams.ViewerDigest); loginLLSD["id0"] = LLSD.FromString(loginParams.id0); // Create the options LLSD array LLSDArray optionsLLSD = new LLSDArray(); for (int i = 0; i < loginParams.Options.Count; i++) optionsLLSD.Add(LLSD.FromString(loginParams.Options[i])); foreach (string[] callbackOpts in CallbackOptions.Values) { if (callbackOpts != null) { for (int i = 0; i < callbackOpts.Length; i++) { if (!optionsLLSD.Contains(callbackOpts[i])) optionsLLSD.Add(callbackOpts[i]); } } } loginLLSD["options"] = optionsLLSD; // Make the CAPS POST for login Uri loginUri; try { loginUri = new Uri(loginParams.URI); } catch (Exception ex) { Client.Log(String.Format("Failed to parse login URI {0}, {1}", loginParams.URI, ex.Message), Helpers.LogLevel.Error); return; } CapsClient loginRequest = new CapsClient(new Uri(loginParams.URI)); loginRequest.OnComplete += new CapsClient.CompleteCallback(LoginReplyHandler); loginRequest.UserData = CurrentContext; loginRequest.StartRequest(LLSDParser.SerializeXmlBytes(loginLLSD), "application/xml+llsd"); }
private void MakeSeedRequest() { if (Simulator == null || !Simulator.Client.Network.Connected) return; // Create a request list LLSDArray req = new LLSDArray(); req.Add("ChatSessionRequest"); req.Add("CopyInventoryFromNotecard"); req.Add("DispatchRegionInfo"); req.Add("EstateChangeInfo"); req.Add("EventQueueGet"); req.Add("FetchInventoryDescendents"); req.Add("GroupProposalBallot"); req.Add("MapLayer"); req.Add("MapLayerGod"); req.Add("NewFileAgentInventory"); req.Add("ParcelPropertiesUpdate"); req.Add("ParcelVoiceInfoRequest"); req.Add("ProvisionVoiceAccountRequest"); req.Add("RemoteParcelRequest"); req.Add("RequestTextureDownload"); req.Add("SearchStatRequest"); req.Add("SearchStatTracking"); req.Add("SendPostcard"); req.Add("SendUserReport"); req.Add("SendUserReportWithScreenshot"); req.Add("ServerReleaseNotes"); req.Add("StartGroupProposal"); req.Add("UpdateGestureAgentInventory"); req.Add("UpdateNotecardAgentInventory"); req.Add("UpdateScriptAgentInventory"); req.Add("UpdateGestureTaskInventory"); req.Add("UpdateNotecardTaskInventory"); req.Add("UpdateScriptTaskInventory"); req.Add("ViewerStartAuction"); req.Add("UntrustedSimulatorMessage"); req.Add("ViewerStats"); _SeedRequest = new CapsClient(new Uri(_SeedCapsURI)); _SeedRequest.OnComplete += new CapsClient.CompleteCallback(SeedRequestCompleteHandler); _SeedRequest.StartRequest(req); }
private void GatherCaps() { // build post data byte[] postData = Encoding.ASCII.GetBytes( String.Format("first_name={0}&last_name={1}&password={2}", _userInfo.FirstName, _userInfo.LastName, _userInfo.Password)); CapsClient request = new CapsClient(RegistrationApiCaps); request.OnComplete += new CapsClient.CompleteCallback(GatherCapsResponse); request.StartRequest(postData); }
/// <summary> /// /// </summary> /// <param name="layer"></param> public void RequestMapLayer(GridLayerType layer) { Uri url = Client.Network.CurrentSim.Caps.CapabilityURI("MapLayer"); if (url != null) { LLSDMap body = new LLSDMap(); body["Flags"] = LLSD.FromInteger((int)layer); CapsClient request = new CapsClient(url); request.OnComplete += new CapsClient.CompleteCallback(MapLayerResponseHandler); request.StartRequest(body); } }
public bool RequestProvisionAccount() { if (Enabled && Client.Network.Connected) { if (Client.Network.CurrentSim != null && Client.Network.CurrentSim.Caps != null) { Uri url = Client.Network.CurrentSim.Caps.CapabilityURI("ProvisionVoiceAccountRequest"); if (url != null) { CapsClient request = new CapsClient(url); request.OnComplete += new CapsClient.CompleteCallback(ProvisionCapsResponse); request.StartRequest(); return true; } else { Client.Log("VoiceManager.RequestProvisionAccount(): ProvisionVoiceAccountRequest capability is missing", Helpers.LogLevel.Info); return false; } } } Client.Log("VoiceManager.RequestProvisionAccount(): Voice system is currently disabled", Helpers.LogLevel.Info); return false; }
private void ProvisionCapsResponse(CapsClient client, LLSD response, Exception error) { if (response is LLSDMap) { LLSDMap respTable = (LLSDMap)response; if (OnProvisionAccount != null) { try { OnProvisionAccount(respTable["username"].AsString(), respTable["password"].AsString()); } catch (Exception e) { Client.Log(e.ToString(), Helpers.LogLevel.Error); } } } }
private void ParcelVoiceInfoResponse(CapsClient client, LLSD response, Exception error) { if (response is LLSDMap) { LLSDMap respTable = (LLSDMap)response; string regionName = respTable["region_name"].AsString(); int localID = (int)respTable["parcel_local_id"].AsInteger(); string channelURI = null; if (respTable["voice_credentials"] is LLSDMap) { LLSDMap creds = (LLSDMap)respTable["voice_credentials"]; channelURI = creds["channel_uri"].AsString(); } if (OnParcelVoiceInfo != null) OnParcelVoiceInfo(regionName, localID, channelURI); } }
private bool RequestVoiceInternal(string me, CapsClient.CompleteCallback callback, string capsName) { if (Enabled && Client.Network.Connected) { if (Client.Network.CurrentSim != null && Client.Network.CurrentSim.Caps != null) { Uri url = Client.Network.CurrentSim.Caps.CapabilityURI(capsName); if (url != null) { CapsClient request = new CapsClient(url); LLSDMap body = new LLSDMap(); request.OnComplete += new CapsClient.CompleteCallback(callback); request.StartRequest(body); return true; } else { Logger.Log("VoiceManager." + me + "(): " + capsName + " capability is missing", Helpers.LogLevel.Info, Client); return false; } } } Logger.Log("VoiceManager.RequestVoiceInternal(): Voice system is currently disabled", Helpers.LogLevel.Info, Client); return false; }
private void CreateItemFromAssetResponse(CapsClient client, LLSD result, Exception error) { object[] args = (object[])client.UserData; CapsClient.ProgressCallback progCallback = (CapsClient.ProgressCallback)args[0]; ItemCreatedFromAssetCallback callback = (ItemCreatedFromAssetCallback)args[1]; byte[] itemData = (byte[])args[2]; LLSDMap contents = (LLSDMap)result; if (result == null) { try { callback(false, error.Message, LLUUID.Zero, LLUUID.Zero); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } return; } string status = contents["state"].AsString().ToLower(); if (status == "upload") { string uploadURL = contents["uploader"].AsString(); Logger.DebugLog("CreateItemFromAsset: uploading to " + uploadURL); // This makes the assumption that all uploads go to CurrentSim, to avoid // the problem of HttpRequestState not knowing anything about simulators CapsClient upload = new CapsClient(new Uri(uploadURL)); upload.OnProgress += progCallback; upload.OnComplete += new CapsClient.CompleteCallback(CreateItemFromAssetResponse); upload.UserData = new object[] { null, callback, itemData }; upload.StartRequest(itemData, "application/octet-stream"); } else if (status == "complete") { Logger.DebugLog("CreateItemFromAsset: completed"); if (contents.ContainsKey("new_inventory_item") && contents.ContainsKey("new_asset")) { try { callback(true, String.Empty, contents["new_inventory_item"].AsUUID(), contents["new_asset"].AsUUID()); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } } else { try { callback(false, "Failed to parse asset and item UUIDs", LLUUID.Zero, LLUUID.Zero); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } } } else { // Failure try { callback(false, status, LLUUID.Zero, LLUUID.Zero); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } } }
/// <summary> /// Returns the new user ID or throws an exception containing the error code /// The error codes can be found here: https://wiki.secondlife.com/wiki/RegAPIError /// </summary> /// <param name="user">New user account to create</param> /// <returns>The UUID of the new user account</returns> public LLUUID CreateUser(CreateUserParam user) { if (Initializing) throw new InvalidOperationException("still initializing"); if (_caps.CreateUser == null) throw new InvalidOperationException("access denied; only approved developers have access to the registration api"); // Create the POST data LLSDMap query = new LLSDMap(); query.Add("username", LLSD.FromString(user.FirstName)); query.Add("last_name_id", LLSD.FromInteger(user.LastName.ID)); query.Add("email", LLSD.FromString(user.Email)); query.Add("password", LLSD.FromString(user.Password)); query.Add("dob", LLSD.FromString(user.Birthdate.ToString("yyyy-MM-dd"))); if (user.LimitedToEstate != null) query.Add("limited_to_estate", LLSD.FromInteger(user.LimitedToEstate.Value)); if (!string.IsNullOrEmpty(user.StartRegionName)) query.Add("start_region_name", LLSD.FromInteger(user.LimitedToEstate.Value)); if (user.StartLocation != null) { query.Add("start_local_x", LLSD.FromReal(user.StartLocation.Value.X)); query.Add("start_local_y", LLSD.FromReal(user.StartLocation.Value.Y)); query.Add("start_local_z", LLSD.FromReal(user.StartLocation.Value.Z)); } if (user.StartLookAt != null) { query.Add("start_look_at_x", LLSD.FromReal(user.StartLookAt.Value.X)); query.Add("start_look_at_y", LLSD.FromReal(user.StartLookAt.Value.Y)); query.Add("start_look_at_z", LLSD.FromReal(user.StartLookAt.Value.Z)); } byte[] postData = LLSDParser.SerializeXmlBytes(query); // Make the request CapsClient request = new CapsClient(_caps.CreateUser); request.OnComplete += new CapsClient.CompleteCallback(CreateUserResponse); request.StartRequest(); // FIXME: Block return LLUUID.Zero; }
private void GatherCapsResponse(CapsClient client, LLSD response, Exception error) { if (response is LLSDMap) { LLSDMap respTable = (LLSDMap)response; // parse _caps = new RegistrationCaps(); _caps.CreateUser = respTable["create_user"].AsUri(); _caps.CheckName = respTable["check_name"].AsUri(); _caps.GetLastNames = respTable["get_last_names"].AsUri(); _caps.GetErrorCodes = respTable["get_error_codes"].AsUri(); // finalize _initializing++; GatherErrorMessages(); } }
private void CreateUserResponse(CapsClient client, LLSD response, Exception error) { if (response is LLSDMap) { // everything is okay // FIXME: //return new LLUUID(((Dictionary<string, object>)response)["agent_id"].ToString()); } else { // an error happened LLSDArray al = (LLSDArray)response; StringBuilder sb = new StringBuilder(); foreach (LLSD ec in al) { if (sb.Length > 0) sb.Append("; "); sb.Append(_errors[ec.AsInteger()]); } // FIXME: //throw new Exception("failed to create user: " + sb.ToString()); } }
private void GatherErrorMessages() { if (_caps.GetErrorCodes == null) throw new InvalidOperationException("access denied"); // this should work even for not-approved users CapsClient request = new CapsClient(_caps.GetErrorCodes); request.OnComplete += new CapsClient.CompleteCallback(GatherErrorMessagesResponse); request.StartRequest(); }
private void MapLayerResponseHandler(CapsClient client, LLSD result, Exception error) { LLSDMap body = (LLSDMap)result; LLSDArray layerData = (LLSDArray)body["LayerData"]; if (OnGridLayer != null) { for (int i = 0; i < layerData.Count; i++) { LLSDMap thisLayerData = (LLSDMap)layerData[i]; GridLayer layer; layer.Bottom = thisLayerData["Bottom"].AsInteger(); layer.Left = thisLayerData["Left"].AsInteger(); layer.Top = thisLayerData["Top"].AsInteger(); layer.Right = thisLayerData["Right"].AsInteger(); layer.ImageID = thisLayerData["ImageID"].AsUUID(); try { OnGridLayer(layer); } catch (Exception e) { Client.Log(e.ToString(), Helpers.LogLevel.Error); } } } if (body.ContainsKey("MapBlocks")) { // TODO: At one point this will become activated Client.Log("Got MapBlocks through CAPS, please finish this function!", Helpers.LogLevel.Error); } }
private void GatherErrorMessagesResponse(CapsClient client, LLSD response, Exception error) { if (response is LLSDMap) { // parse //FIXME: wtf? //foreach (KeyValuePair<string, object> error in (Dictionary<string, object>)response) //{ //StringBuilder sb = new StringBuilder(); //sb.Append(error[1]); //sb.Append(" ("); //sb.Append(error[0]); //sb.Append("): "); //sb.Append(error[2]); //_errors.Add((int)error[0], sb.ToString()); //} // finalize _initializing++; } }
private void LoginReplyHandler(CapsClient client, LLSD result, Exception error) { if (error == null) { if (result != null && result.Type == LLSDType.Map) { LLSDMap map = (LLSDMap)result; LLSD llsd; string reason, message; if (map.TryGetValue("reason", out llsd)) reason = llsd.AsString(); else reason = String.Empty; if (map.TryGetValue("message", out llsd)) message = llsd.AsString(); else message = String.Empty; if (map.TryGetValue("login", out llsd)) { bool loginSuccess = llsd.AsBoolean(); bool redirect = (llsd.AsString() == "indeterminate"); LoginResponseData data = new LoginResponseData(); // Parse successful login replies in to LoginResponseData structs if (loginSuccess) data.Parse(map); if (OnLoginResponse != null) { try { OnLoginResponse(loginSuccess, redirect, message, reason, data); } catch (Exception ex) { Client.Log(ex.ToString(), Helpers.LogLevel.Error); } } if (loginSuccess && !redirect) { // Login succeeded // These parameters are stored in NetworkManager, so instead of registering // another callback for them we just set the values here CircuitCode = data.CircuitCode; LoginSeedCapability = data.SeedCapability; UpdateLoginStatus(LoginStatus.ConnectingToSim, "Connecting to simulator..."); ulong handle = Helpers.UIntsToLong(data.RegionX, data.RegionY); if (data.SimIP != null && data.SimPort != 0) { // Connect to the sim given in the login reply if (Connect(data.SimIP, data.SimPort, handle, true, LoginSeedCapability) != null) { // Request the economy data right after login SendPacket(new EconomyDataRequestPacket()); // Update the login message with the MOTD returned from the server UpdateLoginStatus(LoginStatus.Success, message); // Fire an event for connecting to the grid if (OnConnected != null) { try { OnConnected(this.Client); } catch (Exception e) { Client.Log(e.ToString(), Helpers.LogLevel.Error); } } } else { UpdateLoginStatus(LoginStatus.Failed, "Unable to establish a UDP connection to the simulator"); } } else { UpdateLoginStatus(LoginStatus.Failed, "Login server did not return a simulator address"); } } else if (redirect) { // Login redirected // Make the next login URL jump UpdateLoginStatus(LoginStatus.Redirecting, "Redirecting login..."); LoginParams loginParams = CurrentContext.Value; loginParams.URI = LoginResponseData.ParseString("next_url", map); //CurrentContext.Params.MethodName = LoginResponseData.ParseString("next_method", map); // Ignore next_options and next_duration for now CurrentContext = loginParams; BeginLogin(); } else { // Login failed // Make sure a usable error key is set if (reason != String.Empty) InternalErrorKey = reason; else InternalErrorKey = "unknown"; UpdateLoginStatus(LoginStatus.Failed, message); } } else { // Got an LLSD map but no login value UpdateLoginStatus(LoginStatus.Failed, "login parameter missing in the response"); } } else { // No LLSD response UpdateLoginStatus(LoginStatus.Failed, "Empty or unparseable login response"); } } else { // Connection error UpdateLoginStatus(LoginStatus.Failed, error.Message); } }
public void GatherLastNames() { if (Initializing) throw new InvalidOperationException("still initializing"); if (_caps.GetLastNames == null) throw new InvalidOperationException("access denied: only approved developers have access to the registration api"); CapsClient request = new CapsClient(_caps.GetLastNames); request.OnComplete += new CapsClient.CompleteCallback(GatherLastNamesResponse); request.StartRequest(); // FIXME: Block }
private void SeedRequestCompleteHandler(CapsClient client, LLSD result, Exception error) { if (result != null && result.Type == LLSDType.Map) { LLSDMap respTable = (LLSDMap)result; StringBuilder capsList = new StringBuilder(); foreach (string cap in respTable.Keys) { capsList.Append(cap); capsList.Append(' '); _Caps[cap] = respTable[cap].AsUri(); } Simulator.Client.DebugLog("Got capabilities: " + capsList.ToString()); if (_Caps.ContainsKey("EventQueueGet")) { Simulator.Client.DebugLog("Starting event queue for " + Simulator.ToString()); _EventQueueCap = new EventQueueClient(_Caps["EventQueueGet"]); _EventQueueCap.OnConnected += new EventQueueClient.ConnectedCallback(EventQueueConnectedHandler); _EventQueueCap.OnEvent += new EventQueueClient.EventCallback(EventQueueEventHandler); _EventQueueCap.Start(); } } else { // The initial CAPS connection failed, try again MakeSeedRequest(); } }
private void GatherLastNamesResponse(CapsClient client, LLSD response, Exception error) { if (response is LLSDMap) { LLSDMap respTable = (LLSDMap)response; //FIXME: //_lastNames = new List<LastName>(respTable.Count); //for (Dictionary<string, object>.Enumerator it = respTable.GetEnumerator(); it.MoveNext(); ) //{ // LastName ln = new LastName(); // ln.ID = int.Parse(it.Current.Key.ToString()); // ln.Name = it.Current.Value.ToString(); // _lastNames.Add(ln); //} //_lastNames.Sort(new Comparison<LastName>(delegate(LastName a, LastName b) { return a.Name.CompareTo(b.Name); })); } }
private void CreateItemFromAssetResponse(CapsClient client, LLSD result, Exception error) { LLSDMap contents = (LLSDMap)result; KeyValuePair<ItemCreatedFromAssetCallback, byte[]> kvp = (KeyValuePair<ItemCreatedFromAssetCallback, byte[]>)client.UserData; ItemCreatedFromAssetCallback callback = kvp.Key; byte[] itemData = (byte[])kvp.Value; string status = contents["state"].AsString(); if (status == "upload") { string uploadURL = contents["uploader"].AsString(); // This makes the assumption that all uploads go to CurrentSim, to avoid // the problem of HttpRequestState not knowing anything about simulators CapsClient upload = new CapsClient(new Uri(uploadURL)); upload.OnComplete += new CapsClient.CompleteCallback(CreateItemFromAssetResponse); upload.UserData = kvp; upload.StartRequest(itemData, "application/octet-stream"); } else if (status == "complete") { if (contents.ContainsKey("new_inventory_item") && contents.ContainsKey("new_asset")) { try { callback(true, String.Empty, contents["new_inventory_item"].AsUUID(), contents["new_asset"].AsUUID()); } catch (Exception e) { _Client.Log(e.ToString(), Helpers.LogLevel.Error); } } else { try { callback(false, "Failed to parse asset and item UUIDs", LLUUID.Zero, LLUUID.Zero); } catch (Exception e) { _Client.Log(e.ToString(), Helpers.LogLevel.Error); } } } else { // Failure try { callback(false, status, LLUUID.Zero, LLUUID.Zero); } catch (Exception e) { _Client.Log(e.ToString(), Helpers.LogLevel.Error); } } }
private void MakeSeedRequest() { if (Simulator == null || !Simulator.Client.Network.Connected) return; // Create a request list LLSDArray req = new LLSDArray(); req.Add("MapLayer"); req.Add("MapLayerGod"); req.Add("NewFileAgentInventory"); req.Add("EventQueueGet"); req.Add("UpdateGestureAgentInventory"); req.Add("UpdateNotecardAgentInventory"); req.Add("UpdateScriptAgentInventory"); req.Add("UpdateGestureTaskInventory"); req.Add("UpdateNotecardTaskInventory"); req.Add("UpdateScriptTaskInventory"); req.Add("SendPostcard"); req.Add("ViewerStartAuction"); req.Add("ParcelGodReserveForNewbie"); req.Add("SendUserReport"); req.Add("SendUserReportWithScreenshot"); req.Add("RequestTextureDownload"); req.Add("UntrustedSimulatorMessage"); req.Add("ParcelVoiceInfoRequest"); req.Add("ChatSessionRequest"); req.Add("ProvisionVoiceAccountRequest"); _SeedRequest = new CapsClient(new Uri(_SeedCapsURI)); _SeedRequest.OnComplete += new CapsClient.CompleteCallback(SeedRequestCompleteHandler); _SeedRequest.StartRequest(req); }