private void UploadToAmazonS3(string videoFile, Guid objectId, Guid userId, string format, VideoVersion videoVersion) { try { string keyNamePath = string.Format("{0}/{1}/{2}", userId, Helper.GetMediaFolder(Helper.GetObjectType("Video").NumericId), format); if (videoVersion != VideoVersion.None) { keyNamePath += string.Format(@"/{0}", videoVersion); } string keyName = string.Format(@"{0}/{1}.{2}", keyNamePath, objectId, format).ToLower(); ThreeSharpConfig config = new ThreeSharpConfig(); config.AwsAccessKeyID = amazoneS3AKey; config.AwsSecretAccessKey = amazoneS3SAKey; config.Format = amazoneS3BucketLocation == "EU" ? CallingFormat.SUBDOMAIN : CallingFormat.REGULAR; IThreeSharp service = new ThreeSharpQuery(config); ObjectAddRequest objectAddRequest = new ObjectAddRequest(amazoneS3Bucket, keyName); objectAddRequest.LoadStreamWithFile(videoFile); objectAddRequest.Headers.Add("x-amz-acl", "public-read"); ObjectAddResponse objectAddResponse = service.ObjectAdd(objectAddRequest); objectAddResponse.DataStream.Close(); } catch (Exception e) { throw new Exception("Amazon S3 upload failed: " + e.Message); } }
protected void Page_Load(object sender, EventArgs e) { SlickUpload1.HideDuringUploadElements = "fileSelectText," + uploadButton.ClientID; ThreeSharpConfig cfg = new ThreeSharpConfig(); cfg.AwsAccessKeyID = ConfigurationManager.AppSettings["awsAccessKeyId"]; cfg.AwsSecretAccessKey = ConfigurationManager.AppSettings["awsSecretAccessKey"]; _q = new ThreeSharpQuery(cfg); }
private long UploadToAmazone(string ConvertedFile, string objectID, string userID) { long StreamLength = -1; try { //Attention: Key Is case sensitive string keyName = userID + "/" + Helper.GetMediaFolder(ObjectType.Video) + "/flv/" + objectID + ".flv"; keyName = keyName.ToLower(); ThreeSharpConfig config = new ThreeSharpConfig(); config.AwsAccessKeyID = amazoneS3AKey; config.AwsSecretAccessKey = amazoneS3SAKey; if (amazoneS3BucketLocation == "EU") { config.Format = CallingFormat.SUBDOMAIN; } else { config.Format = CallingFormat.REGULAR; } IThreeSharp service = new ThreeSharpQuery(config); ObjectAddRequest objectAddRequest = new ObjectAddRequest(amazoneS3Bucket, keyName); objectAddRequest.LoadStreamWithFile(ConvertedFile); objectAddRequest.Headers.Add("x-amz-acl", "public-read"); ObjectAddResponse objectAddResponse = service.ObjectAdd(objectAddRequest); objectAddResponse.DataStream.Close(); FileInfo fiUpload = new FileInfo(ConvertedFile); StreamLength = (int)fiUpload.Length; fiUpload = null; } catch (Exception e) { WriteMonitoringLog(strTransactionID, objectID, BaseActions.VideoConvert, 13, "Amazone S3 upload failed", _4screen.CSB.Common.MonitoringLogState.Aborted, e.Message); } return(StreamLength); }
public void CreateTileset() { HttpWebRequest oWebRequest = (HttpWebRequest)WebRequest.Create(GetOriginalUrl()); HttpWebResponse oWebResponse = (HttpWebResponse)oWebRequest.GetResponse(); Stream oWebStream = oWebResponse.GetResponseStream(); Image oImage = Bitmap.FromStream(oWebStream); ThreeSharpConfig config; IThreeSharp service; config = new ThreeSharpConfig(); config.AwsAccessKeyID = S3Storage.AccessKey; config.AwsSecretAccessKey = S3Storage.SecretAccessKey; config.ConnectionLimit = 40; config.IsSecure = true; // It is necessary to use the SUBDOMAIN CallingFormat for accessing EU buckets config.Format = CallingFormat.SUBDOMAIN; service = new ThreeSharpQuery(config); double iZoomLevel = 0; double iMaxDimension = Math.Max(oImage.Width, oImage.Height); int iTileSize = Convert.ToInt32(iMaxDimension); while (iTileSize > 359) { iZoomLevel++; iTileSize = Convert.ToInt32(iMaxDimension / Math.Pow(2, iZoomLevel)); } ZoomLevels = Convert.ToInt32(iZoomLevel); TileSize = iTileSize; int iImageSize = Convert.ToInt32(iMaxDimension); Bitmap oBaseImage = ImageManipulator.CenterImage(oImage as Bitmap, iImageSize, iImageSize); while (iZoomLevel >= 0) { iImageSize = Convert.ToInt32(iTileSize * Math.Pow(2, iZoomLevel)); using (Bitmap oZoomedImage = ImageManipulator.Resize(oBaseImage, iImageSize, iImageSize)) { List<List<Bitmap>> oTiles = ImageManipulator.CreateTiles(oZoomedImage, iTileSize); for (int i = 0; i < oTiles.Count; i++) { for (int j = 0; j < oTiles[i].Count; j++) { bool bUploaded = false; int tryCount = 0; while (bUploaded == false && tryCount < 3) { try { using (MemoryStream oStream = new MemoryStream()) { oTiles[i][j].Save(oStream, System.Drawing.Imaging.ImageFormat.Png); oStream.Position = 0; UploadImage( service, oStream, string.Format("Tile_{0}_{1}_{2}_{3}", j, i, iZoomLevel, mStorageKey), "image/png" ); bUploaded = true; } } catch (ThreeSharpException oException) { tryCount++; if (tryCount > 3) { throw new Exception("Failed to upload tile on third attempt.", oException); } } } } } } iZoomLevel--; } }
private void UploadBaseImages(Stream oStream) { ThreeSharpConfig config; IThreeSharp service; config = new ThreeSharpConfig(); config.AwsAccessKeyID = S3Storage.AccessKey; config.AwsSecretAccessKey = S3Storage.SecretAccessKey; config.ConnectionLimit = 40; config.IsSecure = true; // It is necessary to use the SUBDOMAIN CallingFormat for accessing EU buckets config.Format = CallingFormat.SUBDOMAIN; service = new ThreeSharpQuery(config); string strSquareKey = "Square_" + mStorageKey; string strThumbKey = "Thumb_" + mStorageKey; string strLargeThumbKey = "LargeThumb_" + mStorageKey; string strPreviewKey = "Preview_" + mStorageKey; using (System.Drawing.Image oImage = Bitmap.FromStream(oStream, true, true)) { using (System.Drawing.Image oSquare = ImageManipulator.ResizeAndCrop(oImage as Bitmap, 80, 80)) { using (MemoryStream oMemoryStream = new MemoryStream()) { oSquare.Save(oMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); oMemoryStream.Position = 0; UploadImage(service, oMemoryStream, strSquareKey, "image/jpeg"); } } using (System.Drawing.Image oThumb = ImageManipulator.FitToRectangle(oImage as Bitmap, 100, 100)) { using (MemoryStream oMemoryStream = new MemoryStream()) { oThumb.Save(oMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); oMemoryStream.Position = 0; UploadImage(service, oMemoryStream, strThumbKey, "image/jpeg"); } } using (System.Drawing.Image oLargeThumb = ImageManipulator.FitToRectangle(oImage as Bitmap, 200, 200)) { using (MemoryStream oMemoryStream = new MemoryStream()) { oLargeThumb.Save(oMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); oMemoryStream.Position = 0; UploadImage(service, oMemoryStream, strLargeThumbKey, "image/jpeg"); } } using (System.Drawing.Image oLargeThumb = ImageManipulator.FitToRectangle(oImage as Bitmap, 560, 560)) { using (MemoryStream oMemoryStream = new MemoryStream()) { oLargeThumb.Save(oMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); oMemoryStream.Position = 0; UploadImage(service, oMemoryStream, strPreviewKey, "image/jpeg"); } } } oStream.Position = 0; UploadImage(service, oStream, mStorageKey, ThreeSharpUtils.ConvertExtensionToMimeType(Path.GetExtension(mStorageKey))); ImageSet = 1; // this is the version of the imageset if you change any of the above sizes names or add new ones // this needs to be updated. }
public void Assets_OnImageReceived(ImageDownload image, AssetTexture asset) { if (image.NotFound) { Console.WriteLine("Failed to download " + image.ID + " - not found."); Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("UUID", image.ID); hash.Add("Success", false); hash.Add("Error", "Image not found in database."); enqueue(hash); } else if (image.Success) { bool success = true; string key = image.ID.ToString(); try { libsecondlife.Imaging.ManagedImage decoded; libsecondlife.Imaging.OpenJPEG.DecodeToImage(image.AssetData, out decoded); byte[] img = decoded.ExportTGA(); decoded.Clear(); File.WriteAllBytes(AjaxLife.TEXTURE_CACHE + key + ".tga", img); Process process = Process.Start("convert", AjaxLife.TEXTURE_CACHE + key + ".tga " + AjaxLife.TEXTURE_CACHE + key + ".png"); process.WaitForExit(); process.Dispose(); File.Delete(AjaxLife.TEXTURE_CACHE + key + ".tga"); Console.WriteLine("Downloaded image " + key + " - " + image.Size + " bytes."); if (AjaxLife.USE_S3) { try { IThreeSharp service = new ThreeSharpQuery(AjaxLife.S3Config); Affirma.ThreeSharp.Model.ObjectAddRequest request = new Affirma.ThreeSharp.Model.ObjectAddRequest(AjaxLife.TEXTURE_BUCKET, key + ".png"); request.LoadStreamWithFile(AjaxLife.TEXTURE_CACHE + key + ".png"); request.Headers.Add("x-amz-acl", "public-read"); service.ObjectAdd(request).DataStream.Close(); AjaxLife.CachedTextures.Add(image.ID); } catch { success = false; } File.Delete(AjaxLife.TEXTURE_CACHE + key + ".png"); } } catch (Exception e) { success = false; AjaxLife.Debug("Events", "Texture download for " + key + " failed: " + e.Message); } Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("Success", success); hash.Add("Size", image.Size); hash.Add("UUID", key); hash.Add("URL", AjaxLife.TEXTURE_ROOT + key + ".png"); enqueue(hash); } else { Console.WriteLine("Failed to download " + image.ID + "."); Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("UUID", image.ID); hash.Add("Success", false); hash.Add("Error", "Unknown error."); enqueue(hash); } }
public void Assets_TextureDownloadCallback(TextureRequestState state, AssetTexture texture) { if (state == TextureRequestState.NotFound || state == TextureRequestState.Aborted || state == TextureRequestState.Timeout) { Console.WriteLine("Failed to download " + texture.AssetID + " - " + state.ToString() + "."); Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("UUID", texture.AssetID); hash.Add("Success", false); hash.Add("Error", "Image could not be downloaded: " + state.ToString()); enqueue(hash); } else if (state == TextureRequestState.Finished) { bool success = true; string key = texture.AssetID.ToString(); try { texture.Decode(); byte[] img = texture.Image.ExportRaw(); int size = img.Length; int width = texture.Image.Width; int height = texture.Image.Height; texture.Image.Clear(); // Helpfully, it's upside-down, and has red and blue flipped. // Assuming 32 bits (accurate) and a height as a multiple of two (accurate), // this will vertically invert the image. int length = width * 4; byte[] fliptemp = new byte[length]; for (int i = 0; i < height / 2; ++i) { int index = i * width * 4; int endindex = size - ((i + 1) * width * 4); Array.Copy(img, index, fliptemp, 0, length); Array.Copy(img, endindex, img, index, length); Array.Copy(fliptemp, 0, img, endindex, length); } // This changes RGBA to BGRA. Or possibly vice-versa. I don't actually know. // The documentation is vague/nonexistent. for (int i = 0; i < size; i += 4) { byte temp = img[i + 2]; img[i + 2] = img[i]; img[i] = temp; } // Use System.Drawing.Bitmap to create a PNG. This requires us to feed it a pointer to an array // for whatever reason, so we temporarily pin the image array. GCHandle handle = GCHandle.Alloc(img, GCHandleType.Pinned); Bitmap bitmap = new Bitmap(texture.Image.Width, texture.Image.Height, texture.Image.Width * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject()); bitmap.Save(AjaxLife.TEXTURE_CACHE + key + ".png", System.Drawing.Imaging.ImageFormat.Png); bitmap.Dispose(); handle.Free(); if (AjaxLife.USE_S3) { try { IThreeSharp service = new ThreeSharpQuery(AjaxLife.S3Config); Affirma.ThreeSharp.Model.ObjectAddRequest request = new Affirma.ThreeSharp.Model.ObjectAddRequest(AjaxLife.TEXTURE_BUCKET, key + ".png"); request.LoadStreamWithFile(AjaxLife.TEXTURE_CACHE + key + ".png"); request.Headers.Add("x-amz-acl", "public-read"); request.Headers.Add("Content-Type", "image/png"); service.ObjectAdd(request).DataStream.Close(); AjaxLife.CachedTextures.Add(texture.AssetID); File.Delete(AjaxLife.TEXTURE_CACHE + key + ".png"); } catch { success = false; } } } catch (Exception e) { success = false; AjaxLife.Debug("Events", "Texture download for " + key + " failed (" + e.GetType().Name + "): " + e.Message); } Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("Success", success); hash.Add("UUID", key); hash.Add("URL", AjaxLife.TEXTURE_ROOT + key + ".png"); enqueue(hash); } }
public void OnFileRequested(HttpRequest request, IDirectory directory) { //request.Response.SetHeader("Content-Type", "text/plain; charset=utf-8"); request.Response.ResponseContent = new MemoryStream(); StreamWriter textwriter = new StreamWriter(request.Response.ResponseContent); SecondLife client; AvatarTracker avatars; Events events; StreamReader reader = new StreamReader(request.PostData); string qstring = reader.ReadToEnd(); reader.Dispose(); Dictionary <string, string> POST = AjaxLife.PostDecode(qstring); // Pull out the session. if (!POST.ContainsKey("sid")) { textwriter.WriteLine("Need an SID."); textwriter.Flush(); return; } Guid guid = new Guid(POST["sid"]); User user = new User(); lock (this.users) { if (!this.users.ContainsKey(guid)) { textwriter.WriteLine("Error: invalid SID"); textwriter.Flush(); return; } user = this.users[guid]; client = user.Client; avatars = user.Avatars; events = user.Events; user.LastRequest = DateTime.Now; } // Get the message type. string messagetype = POST["MessageType"]; // Check that the message is signed if it should be. if (Array.IndexOf(REQUIRED_SIGNATURES, messagetype) > -1) { if (!VerifySignature(user, qstring)) { textwriter.WriteLine("Error: Received hash and expected hash do not match."); textwriter.Flush(); return; } } // Right. This file is fun. It takes information in POST paramaters and sends them to // the server in the appropriate format. Some will return data immediately, some will return // keys to data that will arrive in the message queue, some return nothing but you get // something in the message queue later, and some return nother ever. // // The joys of dealing with multiple bizarre message types. switch (messagetype) { case "SpatialChat": client.Self.Chat(POST["Message"], int.Parse(POST["Channel"]), (ChatType)((byte)int.Parse(POST["Type"]))); break; case "SimpleInstantMessage": if (POST.ContainsKey("IMSessionID")) { client.Self.InstantMessage(new LLUUID(POST["Target"]), POST["Message"], new LLUUID(POST["IMSessionID"])); } else { client.Self.InstantMessage(new LLUUID(POST["Target"]), POST["Message"]); } break; case "GenericInstantMessage": client.Self.InstantMessage( client.Self.FirstName + " " + client.Self.LastName, new LLUUID(POST["Target"]), POST["Message"], new LLUUID(POST["IMSessionID"]), (InstantMessageDialog)((byte)int.Parse(POST["Dialog"])), (InstantMessageOnline)int.Parse(POST["Online"]), client.Self.SimPosition, client.Network.CurrentSim.ID, new byte[0]); break; case "NameLookup": client.Avatars.RequestAvatarName(new LLUUID(POST["ID"])); break; case "Teleport": { Hashtable hash = new Hashtable(); bool status; if (POST.ContainsKey("Landmark")) { status = client.Self.Teleport(new LLUUID(POST["Landmark"])); } else { status = client.Self.Teleport(POST["Sim"], new LLVector3(float.Parse(POST["X"]), float.Parse(POST["Y"]), float.Parse(POST["Z"]))); } if (status) { hash.Add("Success", true); hash.Add("Sim", client.Network.CurrentSim.Name); hash.Add("Position", client.Self.SimPosition); } else { hash.Add("Success", false); hash.Add("Reason", client.Self.TeleportMessage); } textwriter.WriteLine(MakeJson.FromHashtable(hash)); } break; case "GoHome": client.Self.GoHome(); break; case "GetPosition": { Hashtable hash = new Hashtable(); hash.Add("Sim", client.Network.CurrentSim.Name); hash.Add("Position", client.Self.SimPosition); textwriter.WriteLine(JavaScriptConvert.SerializeObject(hash)); } break; case "RequestBalance": client.Self.RequestBalance(); break; case "GetStats": { Hashtable hash = new Hashtable(); hash.Add("FPS", client.Network.CurrentSim.Stats.FPS); hash.Add("TimeDilation", client.Network.CurrentSim.Stats.Dilation); hash.Add("LSLIPS", client.Network.CurrentSim.Stats.LSLIPS); hash.Add("Objects", client.Network.CurrentSim.Stats.Objects); hash.Add("ActiveScripts", client.Network.CurrentSim.Stats.ActiveScripts); hash.Add("Agents", client.Network.CurrentSim.Stats.Agents); hash.Add("ChildAgents", client.Network.CurrentSim.Stats.ChildAgents); hash.Add("AjaxLifeSessions", users.Count); hash.Add("TextureCacheCount", AjaxLife.TextureCacheCount); hash.Add("TextureCacheSize", AjaxLife.TextureCacheSize); textwriter.WriteLine(MakeJson.FromHashtable(hash)); } break; case "TeleportLureRespond": client.Self.TeleportLureRespond(new LLUUID(POST["RequesterID"]), bool.Parse(POST["Accept"])); break; case "GodlikeTeleportLureRespond": { LLUUID lurer = new LLUUID(POST["RequesterID"]); LLUUID session = new LLUUID(POST["SessionID"]); client.Self.InstantMessage(client.Self.Name, lurer, "", LLUUID.Random(), InstantMessageDialog.AcceptTeleport, InstantMessageOnline.Offline, client.Self.SimPosition, LLUUID.Zero, new byte[0]); TeleportLureRequestPacket lure = new TeleportLureRequestPacket(); lure.Info.AgentID = client.Self.AgentID; lure.Info.SessionID = client.Self.SessionID; lure.Info.LureID = session; lure.Info.TeleportFlags = (uint)AgentManager.TeleportFlags.ViaGodlikeLure; client.Network.SendPacket(lure); } break; case "FindPeople": { Hashtable hash = new Hashtable(); hash.Add("QueryID", client.Directory.StartPeopleSearch(DirectoryManager.DirFindFlags.People, POST["Search"], int.Parse(POST["Start"]))); textwriter.WriteLine(MakeJson.FromHashtable(hash)); } break; case "FindGroups": { Hashtable hash = new Hashtable(); hash.Add("QueryID", client.Directory.StartGroupSearch(DirectoryManager.DirFindFlags.Groups, POST["Search"], int.Parse(POST["Start"]))); textwriter.WriteLine(MakeJson.FromHashtable(hash)); } break; case "GetAgentData": client.Avatars.RequestAvatarProperties(new LLUUID(POST["AgentID"])); break; case "StartAnimation": client.Self.AnimationStart(new LLUUID(POST["Animation"]), false); break; case "StopAnimation": client.Self.AnimationStop(new LLUUID(POST["Animation"]), true); break; case "SendAppearance": client.Appearance.SetPreviousAppearance(false); break; case "GetMapItems": { MapItemRequestPacket req = new MapItemRequestPacket(); req.AgentData.AgentID = client.Self.AgentID; req.AgentData.SessionID = client.Self.SessionID; GridRegion region; client.Grid.GetGridRegion(POST["Region"], GridLayerType.Objects, out region); req.RequestData.RegionHandle = region.RegionHandle; req.RequestData.ItemType = uint.Parse(POST["ItemType"]); client.Network.SendPacket((Packet)req); } break; case "GetMapBlocks": { MapBlockRequestPacket req = new MapBlockRequestPacket(); req.AgentData.AgentID = client.Self.AgentID; req.AgentData.SessionID = client.Self.SessionID; req.PositionData.MinX = 0; req.PositionData.MinY = 0; req.PositionData.MaxX = ushort.MaxValue; req.PositionData.MaxY = ushort.MaxValue; client.Network.SendPacket((Packet)req); } break; case "GetMapBlock": { ushort x = ushort.Parse(POST["X"]); ushort y = ushort.Parse(POST["Y"]); MapBlockRequestPacket req = new MapBlockRequestPacket(); req.AgentData.AgentID = client.Self.AgentID; req.AgentData.SessionID = client.Self.SessionID; req.PositionData.MinX = x; req.PositionData.MinY = y; req.PositionData.MaxX = x; req.PositionData.MaxY = y; client.Network.SendPacket((Packet)req); } break; case "GetOfflineMessages": { RetrieveInstantMessagesPacket req = new RetrieveInstantMessagesPacket(); req.AgentData.AgentID = client.Self.AgentID; req.AgentData.SessionID = client.Self.SessionID; client.Network.SendPacket((Packet)req); } break; case "GetFriendList": { InternalDictionary <LLUUID, FriendInfo> friends = client.Friends.FriendList; List <Hashtable> friendlist = new List <Hashtable>(); friends.ForEach(delegate(FriendInfo friend) { Hashtable friendhash = new Hashtable(); friendhash.Add("ID", friend.UUID.ToString()); friendhash.Add("Name", friend.Name); friendhash.Add("Online", friend.IsOnline); friendhash.Add("MyRights", friend.MyFriendRights); friendhash.Add("TheirRights", friend.TheirFriendRights); friendlist.Add(friendhash); }); textwriter.Write(MakeJson.FromObject(friendlist)); } break; case "ChangeRights": { LLUUID uuid = new LLUUID(POST["Friend"]); client.Friends.GrantRights(uuid, (FriendRights)int.Parse(POST["Rights"])); } break; case "RequestLocation": client.Friends.MapFriend(new LLUUID(POST["Friend"])); break; case "RequestTexture": { // This one's confusing, so it gets some comments. // First, we get the image's UUID. LLUUID image = new LLUUID(POST["ID"]); // We prepare a query to ask if S3 has it. HEAD only to avoid wasting // GET requests and bandwidth. bool exists = false; // If we already know we have it, note this. if (AjaxLife.CachedTextures.Contains(image)) { exists = true; } else { // If we're using S3, check the S3 bucket if (AjaxLife.USE_S3) { // Otherwise, make that HEAD request and find out. try { IThreeSharp query = new ThreeSharpQuery(AjaxLife.S3Config); Affirma.ThreeSharp.Model.ObjectGetRequest s3request = new Affirma.ThreeSharp.Model.ObjectGetRequest(AjaxLife.TEXTURE_BUCKET, image.ToString() + ".png"); s3request.Method = "HEAD"; Affirma.ThreeSharp.Model.ObjectGetResponse s3response = query.ObjectGet(s3request); if (s3response.StatusCode == System.Net.HttpStatusCode.OK) { exists = true; } s3response.DataStream.Close(); } catch { } } // If we aren't using S3, just check the texture cache. else { exists = File.Exists(AjaxLife.TEXTURE_CACHE + image.ToString() + ".png"); } } // If it exists, reply with Ready = true and the URL to find it at. if (exists) { textwriter.Write("{Ready: true, URL: \"" + AjaxLife.TEXTURE_ROOT + image + ".png\"}"); } // If it doesn't, request the image from SL and note its lack of readiness. // Notification will arrive later in the message queue. else { client.Assets.RequestImage(image, ImageType.Normal, 125000.0f, 0); textwriter.Write("{Ready: false}"); } } break; case "AcceptFriendship": client.Friends.AcceptFriendship(client.Self.AgentID, POST["IMSessionID"]); break; case "DeclineFriendship": client.Friends.DeclineFriendship(client.Self.AgentID, POST["IMSessionID"]); break; case "OfferFriendship": client.Friends.OfferFriendship(new LLUUID(POST["Target"])); break; case "TerminateFriendship": client.Friends.TerminateFriendship(new LLUUID(POST["Target"])); break; case "SendAgentMoney": client.Self.GiveAvatarMoney(new LLUUID(POST["Target"]), int.Parse(POST["Amount"])); break; case "RequestAvatarList": { List <Hashtable> list = new List <Hashtable>(); foreach (KeyValuePair <uint, Avatar> pair in avatars.Avatars) { Avatar avatar = pair.Value; Hashtable hash = new Hashtable(); hash.Add("Name", avatar.Name); hash.Add("ID", avatar.ID); hash.Add("LocalID", avatar.LocalID); hash.Add("Position", avatar.Position); //hash.Add("Rotation", avatar.Rotation); hash.Add("Scale", avatar.Scale); hash.Add("GroupName", avatar.GroupName); list.Add(hash); } textwriter.Write(MakeJson.FromObject(list)); } break; case "LoadInventoryFolder": client.Inventory.RequestFolderContents(new LLUUID(POST["UUID"]), client.Self.AgentID, true, true, InventorySortOrder.ByDate | InventorySortOrder.SystemFoldersToTop); break; case "RequestAsset": { try { LLUUID transferid = client.Assets.RequestInventoryAsset(new LLUUID(POST["AssetID"]), new LLUUID(POST["InventoryID"]), LLUUID.Zero, new LLUUID(POST["OwnerID"]), (AssetType)int.Parse(POST["AssetType"]), false); textwriter.Write("{TransferID: \"" + transferid + "\"}"); } catch // Try catching the error that sometimes gets thrown... but sometimes doesn't. { } } break; case "SendTeleportLure": client.Self.SendTeleportLure(new LLUUID(POST["Target"]), POST["Message"]); break; case "ScriptPermissionResponse": client.Self.ScriptQuestionReply(client.Network.CurrentSim, new LLUUID(POST["ItemID"]), new LLUUID(POST["TaskID"]), (ScriptPermission)int.Parse(POST["Permissions"])); break; case "ScriptDialogReply": { ScriptDialogReplyPacket packet = new ScriptDialogReplyPacket(); packet.AgentData.AgentID = client.Self.AgentID; packet.AgentData.SessionID = client.Self.SessionID; packet.Data.ButtonIndex = int.Parse(POST["ButtonIndex"]); packet.Data.ButtonLabel = Helpers.StringToField(POST["ButtonLabel"]); packet.Data.ChatChannel = int.Parse(POST["ChatChannel"]); packet.Data.ObjectID = new LLUUID(POST["ObjectID"]); client.Network.SendPacket((Packet)packet); } break; case "SaveNotecard": client.Inventory.RequestUploadNotecardAsset(Helpers.StringToField(POST["AssetData"]), new LLUUID(POST["ItemID"]), new InventoryManager.NotecardUploadedAssetCallback(events.Inventory_OnNoteUploaded)); break; case "CreateInventory": client.Inventory.RequestCreateItem(new LLUUID(POST["Folder"]), POST["Name"], POST["Description"], (AssetType)int.Parse(POST["AssetType"]), LLUUID.Random(), (InventoryType)int.Parse(POST["InventoryType"]), PermissionMask.All, new InventoryManager.ItemCreatedCallback(events.Inventory_OnItemCreated)); break; case "CreateFolder": { LLUUID folder = client.Inventory.CreateFolder(new LLUUID(POST["Parent"]), POST["Name"]); textwriter.Write("{FolderID: \"" + folder + "\"}"); } break; case "EmptyTrash": client.Inventory.EmptyTrash(); break; case "MoveItem": client.Inventory.MoveItem(new LLUUID(POST["Item"]), new LLUUID(POST["TargetFolder"]), POST["NewName"]); break; case "MoveFolder": client.Inventory.MoveFolder(new LLUUID(POST["Folder"]), new LLUUID(POST["NewParent"])); break; case "MoveItems": case "MoveFolders": { Dictionary <LLUUID, LLUUID> dict = new Dictionary <LLUUID, LLUUID>(); string[] moves = POST["ToMove"].Split(','); for (int i = 0; i < moves.Length; ++i) { string[] move = moves[i].Split(' '); dict.Add(new LLUUID(move[0]), new LLUUID(move[1])); } if (messagetype == "MoveItems") { client.Inventory.MoveItems(dict); } else if (messagetype == "MoveFolders") { client.Inventory.MoveFolders(dict); } } break; case "DeleteItem": client.Inventory.RemoveItem(new LLUUID(POST["Item"])); break; case "DeleteFolder": client.Inventory.RemoveFolder(new LLUUID(POST["Folder"])); break; case "DeleteMultiple": { string[] items = POST["Items"].Split(','); List <LLUUID> itemlist = new List <LLUUID>(); for (int i = 0; i < items.Length; ++i) { itemlist.Add(new LLUUID(items[i])); } string[] folders = POST["Folders"].Split(','); List <LLUUID> folderlist = new List <LLUUID>(); for (int i = 0; i < items.Length; ++i) { folderlist.Add(new LLUUID(folders[i])); } client.Inventory.Remove(itemlist, folderlist); } break; case "GiveInventory": { client.Inventory.GiveItem(new LLUUID(POST["ItemID"]), POST["ItemName"], (AssetType)int.Parse(POST["AssetType"]), new LLUUID(POST["Recipient"]), true); } break; case "UpdateItem": { InventoryItem item = client.Inventory.FetchItem(new LLUUID(POST["ItemID"]), new LLUUID(POST["OwnerID"]), 1000); if (POST.ContainsKey("Name")) { item.Name = POST["Name"]; } if (POST.ContainsKey("Description")) { item.Description = POST["Description"]; } if (POST.ContainsKey("NextOwnerMask")) { item.Permissions.NextOwnerMask = (PermissionMask)uint.Parse(POST["NextOwnerMask"]); } if (POST.ContainsKey("SalePrice")) { item.SalePrice = int.Parse(POST["SalePrice"]); } if (POST.ContainsKey("SaleType")) { item.SaleType = (SaleType)int.Parse(POST["SaleType"]); // This should be byte.Parse, but this upsets mono's compiler (CS1002) } client.Inventory.RequestUpdateItem(item); } break; case "UpdateFolder": { UpdateInventoryFolderPacket packet = new UpdateInventoryFolderPacket(); packet.AgentData.AgentID = client.Self.AgentID; packet.AgentData.SessionID = client.Self.SessionID; packet.FolderData = new UpdateInventoryFolderPacket.FolderDataBlock[1]; packet.FolderData[0] = new UpdateInventoryFolderPacket.FolderDataBlock(); packet.FolderData[0].FolderID = new LLUUID(POST["FolderID"]); packet.FolderData[0].ParentID = new LLUUID(POST["ParentID"]); packet.FolderData[0].Type = sbyte.Parse(POST["Type"]); packet.FolderData[0].Name = Helpers.StringToField(POST["Name"]); client.Network.SendPacket((Packet)packet); } break; case "FetchItem": client.Inventory.FetchItem(new LLUUID(POST["Item"]), new LLUUID(POST["Owner"]), 5000); break; case "ReRotate": user.Rotation = -Math.PI; break; case "StartGroupIM": AjaxLife.Debug("SendMessage", "RequestJoinGroupChat(" + POST["Group"] + ")"); client.Self.RequestJoinGroupChat(new LLUUID(POST["Group"])); break; case "GroupInstantMessage": client.Self.InstantMessageGroup(new LLUUID(POST["Group"]), POST["Message"]); break; case "RequestGroupProfile": client.Groups.RequestGroupProfile(new LLUUID(POST["Group"])); break; case "RequestGroupMembers": client.Groups.RequestGroupMembers(new LLUUID(POST["Group"])); break; case "RequestGroupName": client.Groups.RequestGroupName(new LLUUID(POST["ID"])); break; case "JoinGroup": client.Groups.RequestJoinGroup(new LLUUID(POST["Group"])); break; case "LeaveGroup": client.Groups.LeaveGroup(new LLUUID(POST["Group"])); break; case "RequestCurrentGroups": client.Groups.RequestCurrentGroups(); break; case "GetParcelID": textwriter.Write("{LocalID: " + client.Parcels.GetParcelLocalID(client.Network.CurrentSim, new LLVector3(float.Parse(POST["X"]), float.Parse(POST["Y"]), float.Parse(POST["Z"]))) + "}"); break; case "RequestParcelProperties": client.Parcels.PropertiesRequest(client.Network.CurrentSim, int.Parse(POST["LocalID"]), int.Parse(POST["SequenceID"])); break; } textwriter.Flush(); }
public void Assets_TextureDownloadCallback(TextureRequestState state, AssetTexture texture) { if(state == TextureRequestState.NotFound || state == TextureRequestState.Aborted || state == TextureRequestState.Timeout) { Console.WriteLine("Failed to download " + texture.AssetID + " - " + state.ToString() + "."); Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("UUID", texture.AssetID); hash.Add("Success", false); hash.Add("Error", "Image could not be downloaded: " + state.ToString()); enqueue(hash); } else if(state == TextureRequestState.Finished) { bool success = true; string key = texture.AssetID.ToString(); try { texture.Decode(); byte[] img = texture.Image.ExportRaw(); int size = img.Length; int width = texture.Image.Width; int height = texture.Image.Height; texture.Image.Clear(); // Helpfully, it's upside-down, and has red and blue flipped. // Assuming 32 bits (accurate) and a height as a multiple of two (accurate), // this will vertically invert the image. int length = width * 4; byte[] fliptemp = new byte[length]; for(int i = 0; i < height / 2; ++i) { int index = i * width * 4; int endindex = size - ((i+1) * width * 4); Array.Copy(img, index, fliptemp, 0, length); Array.Copy(img, endindex, img, index, length); Array.Copy(fliptemp, 0, img, endindex, length); } // This changes RGBA to BGRA. Or possibly vice-versa. I don't actually know. // The documentation is vague/nonexistent. for(int i = 0; i < size; i += 4) { byte temp = img[i+2]; img[i+2] = img[i]; img[i] = temp; } // Use System.Drawing.Bitmap to create a PNG. This requires us to feed it a pointer to an array // for whatever reason, so we temporarily pin the image array. GCHandle handle = GCHandle.Alloc(img, GCHandleType.Pinned); Bitmap bitmap = new Bitmap(texture.Image.Width, texture.Image.Height, texture.Image.Width * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject()); bitmap.Save(AjaxLife.TEXTURE_CACHE + key + ".png", System.Drawing.Imaging.ImageFormat.Png); bitmap.Dispose(); handle.Free(); if(AjaxLife.USE_S3) { try { IThreeSharp service = new ThreeSharpQuery(AjaxLife.S3Config); Affirma.ThreeSharp.Model.ObjectAddRequest request = new Affirma.ThreeSharp.Model.ObjectAddRequest(AjaxLife.TEXTURE_BUCKET, key + ".png"); request.LoadStreamWithFile(AjaxLife.TEXTURE_CACHE + key + ".png"); request.Headers.Add("x-amz-acl", "public-read"); request.Headers.Add("Content-Type", "image/png"); service.ObjectAdd(request).DataStream.Close(); AjaxLife.CachedTextures.Add(texture.AssetID); File.Delete(AjaxLife.TEXTURE_CACHE + key + ".png"); } catch { success = false; } } } catch(Exception e) { success = false; AjaxLife.Debug("Events", "Texture download for "+key+" failed (" + e.GetType().Name + "): " + e.Message); } Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("Success", success); hash.Add("UUID", key); hash.Add("URL", AjaxLife.TEXTURE_ROOT + key + ".png"); enqueue(hash); } }
public void Assets_OnImageReceived(ImageDownload image, AssetTexture asset) { if (image.NotFound) { Console.WriteLine("Failed to download " + image.ID + " - not found."); Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("UUID", image.ID); hash.Add("Success", false); hash.Add("Error", "Image not found in database."); enqueue(hash); } else if (image.Success) { bool success = true; string key = image.ID.ToString(); try { libsecondlife.Imaging.ManagedImage decoded; libsecondlife.Imaging.OpenJPEG.DecodeToImage(image.AssetData, out decoded); byte[] img = decoded.ExportTGA(); decoded.Clear(); File.WriteAllBytes(AjaxLife.TEXTURE_CACHE + key + ".tga", img); Process process = Process.Start("convert", AjaxLife.TEXTURE_CACHE + key + ".tga " + AjaxLife.TEXTURE_CACHE + key + ".png"); process.WaitForExit(); process.Dispose(); File.Delete(AjaxLife.TEXTURE_CACHE + key + ".tga"); Console.WriteLine("Downloaded image " + key + " - " + image.Size + " bytes."); if(AjaxLife.USE_S3) { try { IThreeSharp service = new ThreeSharpQuery(AjaxLife.S3Config); Affirma.ThreeSharp.Model.ObjectAddRequest request = new Affirma.ThreeSharp.Model.ObjectAddRequest(AjaxLife.TEXTURE_BUCKET, key + ".png"); request.LoadStreamWithFile(AjaxLife.TEXTURE_CACHE + key + ".png"); request.Headers.Add("x-amz-acl", "public-read"); service.ObjectAdd(request).DataStream.Close(); AjaxLife.CachedTextures.Add(image.ID); } catch { success = false; } File.Delete(AjaxLife.TEXTURE_CACHE + key + ".png"); } } catch(Exception e) { success = false; AjaxLife.Debug("Events", "Texture download for "+key+" failed: "+e.Message); } Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("Success", success); hash.Add("Size", image.Size); hash.Add("UUID", key); hash.Add("URL", AjaxLife.TEXTURE_ROOT + key + ".png"); enqueue(hash); } else { Console.WriteLine("Failed to download " + image.ID + "."); Hashtable hash = new Hashtable(); hash.Add("MessageType", "ImageDownloaded"); hash.Add("UUID", image.ID); hash.Add("Success", false); hash.Add("Error", "Unknown error."); enqueue(hash); } }
static void DemonstrateThreeSharp() { Console.WriteLine("==========================================="); Console.WriteLine("Demonstrating the ThreeSharp Library"); Console.WriteLine("==========================================="); ThreeSharpConfig config = new ThreeSharpConfig(); config.AwsAccessKeyID = awsAccessKeyId; config.AwsSecretAccessKey = awsSecretAccessKey; config.IsSecure = false; IThreeSharp service = new ThreeSharpQuery(config); // Convert the bucket name to lowercase for vanity domains. // the bucket must be lower case since DNS is case-insensitive. Random r = new Random(); string testBucketName = awsAccessKeyId.ToLower() + "-test-bucket" + r.Next(50000).ToString();; string testBucketName2 = awsAccessKeyId.ToLower() + "-test-bucket" + r.Next(50000).ToString();; string stringKeyName = "StringObject"; Console.WriteLine("\n----- Creating Bucket " + testBucketName + " -----"); using (BucketAddRequest request = new BucketAddRequest(testBucketName)) using (BucketAddResponse response = service.BucketAdd(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Creating Bucket " + testBucketName2 + " -----"); using (BucketAddRequest request = new BucketAddRequest(testBucketName2)) using (BucketAddResponse response = service.BucketAdd(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName2 + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName2)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Adding String Object to " + testBucketName + " -----"); using (ObjectAddRequest request = new ObjectAddRequest(testBucketName, stringKeyName)) { request.LoadStreamWithString("This is a string object."); using (ObjectAddResponse response = service.ObjectAdd(request)) { } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Getting String Object -----"); using (ObjectGetRequest request = new ObjectGetRequest(testBucketName, stringKeyName)) { using (ObjectGetResponse response = service.ObjectGet(request)) { Console.WriteLine(response.StreamResponseToString()); } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Copying String Object to " + testBucketName2 + " -----"); using (ObjectCopyRequest request = new ObjectCopyRequest(testBucketName, stringKeyName, testBucketName2, stringKeyName + "Copy")) using (ObjectCopyResponse response = service.ObjectCopy(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName2 + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName2)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Getting RequestPaymentConfiguration for " + testBucketName2 + " -----"); using (PaymentGetRequest request = new PaymentGetRequest(testBucketName2)) using (PaymentGetResponse response = service.PaymentGet(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Changing RequestPaymentConfiguration for " + testBucketName2 + " -----"); using (PaymentChangeRequest request = new PaymentChangeRequest(testBucketName2, PaymentChangeRequest.Payer.Requester)) using (PaymentChangeResponse response = service.PaymentChange(request)) { } Console.WriteLine("\n----- Getting RequestPaymentConfiguration (again) for " + testBucketName2 + " -----"); using (PaymentGetRequest request = new PaymentGetRequest(testBucketName2)) using (PaymentGetResponse response = service.PaymentGet(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Changing RequestPaymentConfiguration for " + testBucketName2 + " -----"); using (PaymentChangeRequest request = new PaymentChangeRequest(testBucketName2, PaymentChangeRequest.Payer.BucketOwner)) using (PaymentChangeResponse response = service.PaymentChange(request)) { } Console.WriteLine("\n----- Getting Copied String Object -----"); using (ObjectGetRequest request = new ObjectGetRequest(testBucketName2, stringKeyName + "Copy")) { using (ObjectGetResponse response = service.ObjectGet(request)) { Console.WriteLine(response.StreamResponseToString()); } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Streaming File Object -----"); using (ObjectAddRequest request = new ObjectAddRequest(testBucketName, uploadFile)) { request.LoadStreamWithFile(uploadPath + uploadFile); using (ObjectAddResponse response = service.ObjectAdd(request)) { } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Streaming/Encrypting File Object -----"); using (ObjectAddRequest request = new ObjectAddRequest(testBucketName, uploadFile + "Encrypted")) { request.LoadStreamWithFile(uploadPath + uploadFile); request.EncryptStream(encryptionKey, encryptionIV); using (ObjectAddResponse response = service.ObjectAdd(request)) { } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Streaming File to Disk -----"); using (ObjectGetRequest request = new ObjectGetRequest(testBucketName, uploadFile)) using (ObjectGetResponse response = service.ObjectGet(request)) { response.StreamResponseToFile(downloadPath + uploadFile); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Streaming/Decrypting File to Disk -----"); using (ObjectGetRequest request = new ObjectGetRequest(testBucketName, uploadFile + "Encrypted")) using (ObjectGetResponse response = service.ObjectGet(request)) { response.DecryptStream(encryptionKey, encryptionIV); response.StreamResponseToFile(downloadPath + "decrypted-" + uploadFile); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Query String Authorization Example -----"); using (UrlGetRequest request = new UrlGetRequest(testBucketName, uploadFile)) { request.ExpiresIn = 60 * 1000; using (UrlGetResponse response = service.UrlGet(request)) { Console.WriteLine("Try this url in your web browser (it will only work for 60 seconds)\n"); Console.WriteLine(response.StreamResponseToString()); } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Adding String Object with Metadata and Public Read ACL -----"); using (ObjectAddRequest request = new ObjectAddRequest(testBucketName, stringKeyName + "Public")) { request.LoadStreamWithString("This is a publicly readable test."); request.MetaData.Add("blah", "foo"); request.Headers.Add("x-amz-acl", "private"); //request.Headers.Add("x-amz-acl", "public-read"); //request.Headers.Add("x-amz-acl", "public-read-write"); //request.Headers.Add("x-amz-acl", "authenticated-read"); using (ObjectAddResponse response = service.ObjectAdd(request)) { } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Getting Object's ACL -----"); using (ACLGetRequest request = new ACLGetRequest(testBucketName, stringKeyName + "Public")) using (ACLGetResponse response = service.ACLGet(request)) { string output = response.StreamResponseToString(); Console.WriteLine(output); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Changing Object's ACL -----"); using (ACLChangeRequest request = new ACLChangeRequest(testBucketName, stringKeyName + "Public", "public-read")) using (ACLChangeResponse response = service.ACLChange(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Getting Object's ACL -----"); using (ACLGetRequest request = new ACLGetRequest(testBucketName, stringKeyName + "Public")) using (ACLGetResponse response = service.ACLGet(request)) { string output = response.StreamResponseToString(); Console.WriteLine(output); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Deleting Objects -----"); using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName, stringKeyName)) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName2, stringKeyName + "Copy")) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName, uploadFile)) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName, uploadFile + "Encrypted")) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName, stringKeyName + "Public")) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName2 + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName2)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing All My Buckets -----"); using (BucketListRequest request = new BucketListRequest(null)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Deleting Bucket " + testBucketName + " -----"); using (BucketDeleteRequest request = new BucketDeleteRequest(testBucketName)) using (BucketDeleteResponse response = service.BucketDelete(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Deleting Bucket " + testBucketName2 + " -----"); using (BucketDeleteRequest request = new BucketDeleteRequest(testBucketName2)) using (BucketDeleteResponse response = service.BucketDelete(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing All My Buckets -----"); using (BucketListRequest request = new BucketListRequest(null)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\nTotal data transfers: " + service.GetTransferInfos().Length.ToString()); Console.WriteLine("Total bytes uploaded: " + service.GetTotalBytesUploaded().ToString()); Console.WriteLine("Total bytes downloaded: " + service.GetTotalBytesDownloaded().ToString()); Console.WriteLine("\npress enter >"); Console.ReadLine(); }
static void DemonstrateThreeSharp() { Console.WriteLine("==========================================="); Console.WriteLine("Demonstrating the ThreeSharp Library"); Console.WriteLine("==========================================="); ThreeSharpConfig config = new ThreeSharpConfig(); config.AwsAccessKeyID = awsAccessKeyId; config.AwsSecretAccessKey = awsSecretAccessKey; IThreeSharp service = new ThreeSharpQuery(config); // Convert the bucket name to lowercase for vanity domains. // the bucket must be lower case since DNS is case-insensitive. Random r = new Random(); string testBucketName = awsAccessKeyId.ToLower() + "-test-bucket" + r.Next(50000).ToString();; string testBucketName2 = awsAccessKeyId.ToLower() + "-test-bucket" + r.Next(50000).ToString(); ; string stringKeyName = "StringObject"; string encryptedFileKeyName = "EncryptedFileObject"; Console.WriteLine("\n----- Creating Bucket " + testBucketName + " -----"); using (BucketAddRequest request = new BucketAddRequest(testBucketName)) using (BucketAddResponse response = service.BucketAdd(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Creating Bucket " + testBucketName2 + " -----"); using (BucketAddRequest request = new BucketAddRequest(testBucketName2)) using (BucketAddResponse response = service.BucketAdd(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName2 + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName2)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Adding String Object to " + testBucketName + " -----"); using (ObjectAddRequest request = new ObjectAddRequest(testBucketName, stringKeyName)) { request.LoadStreamWithString("This is a string object."); using (ObjectAddResponse response = service.ObjectAdd(request)) { } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Getting String Object -----"); using (ObjectGetRequest request = new ObjectGetRequest(testBucketName, stringKeyName)) { using (ObjectGetResponse response = service.ObjectGet(request)) { Console.WriteLine(response.StreamResponseToString()); } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Copying String Object to " + testBucketName2 + " -----"); using (ObjectCopyRequest request = new ObjectCopyRequest(testBucketName, stringKeyName, testBucketName2, stringKeyName + "Copy")) using (ObjectCopyResponse response = service.ObjectCopy(request)) { int i = 0; } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName2 + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName2)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Getting Copied String Object -----"); using (ObjectGetRequest request = new ObjectGetRequest(testBucketName2, stringKeyName + "Copy")) { using (ObjectGetResponse response = service.ObjectGet(request)) { Console.WriteLine(response.StreamResponseToString()); } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Streaming File Object -----"); using (ObjectAddRequest request = new ObjectAddRequest(testBucketName, uploadFile)) { request.LoadStreamWithFile(uploadPath + uploadFile); using (ObjectAddResponse response = service.ObjectAdd(request)) { } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Streaming/Encrypting File Object -----"); using (ObjectAddRequest request = new ObjectAddRequest(testBucketName, uploadFile + "Encrypted")) { request.LoadStreamWithFile(uploadPath + uploadFile); request.EncryptStream(encryptionKey, encryptionIV); using (ObjectAddResponse response = service.ObjectAdd(request)) { } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Streaming File to Disk -----"); using (ObjectGetRequest request = new ObjectGetRequest(testBucketName, uploadFile)) using (ObjectGetResponse response = service.ObjectGet(request)) { response.StreamResponseToFile(downloadPath + uploadFile); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Streaming/Decrypting File to Disk -----"); using (ObjectGetRequest request = new ObjectGetRequest(testBucketName, uploadFile + "Encrypted")) using (ObjectGetResponse response = service.ObjectGet(request)) { response.DecryptStream(encryptionKey, encryptionIV); response.StreamResponseToFile(downloadPath + "decrypted-" + uploadFile); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Query String Authorization Example -----"); using (UrlGetRequest request = new UrlGetRequest(testBucketName, uploadFile)) { request.ExpiresIn = 60 * 1000; using (UrlGetResponse response = service.UrlGet(request)) { Console.WriteLine("Try this url in your web browser (it will only work for 60 seconds)\n"); Console.WriteLine(response.StreamResponseToString()); } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Adding String Object with Metadata and Public Read ACL -----"); using (ObjectAddRequest request = new ObjectAddRequest(testBucketName, stringKeyName + "Public")) { request.LoadStreamWithString("This is a publicly readable test."); request.MetaData.Add("blah", "foo"); //request.Headers.Add("x-amz-acl", "private"); request.Headers.Add("x-amz-acl", "public-read"); //request.Headers.Add("x-amz-acl", "public-read-write"); //request.Headers.Add("x-amz-acl", "authenticated-read"); using (ObjectAddResponse response = service.ObjectAdd(request)) { } } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Getting Object's ACL -----"); using (ACLGetRequest request = new ACLGetRequest(testBucketName, stringKeyName + "Public")) using (ACLGetResponse response = service.ACLGet(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Deleting Objects -----"); using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName, stringKeyName)) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName2, stringKeyName + "Copy")) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName, uploadFile)) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName, uploadFile + "Encrypted")) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } using (ObjectDeleteRequest request = new ObjectDeleteRequest(testBucketName, stringKeyName + "Public")) using (ObjectDeleteResponse response = service.ObjectDelete(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing Bucket " + testBucketName2 + " -----"); using (BucketListRequest request = new BucketListRequest(testBucketName2)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing All My Buckets -----"); using (BucketListRequest request = new BucketListRequest(null)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Deleting Bucket " + testBucketName + " -----"); using (BucketDeleteRequest request = new BucketDeleteRequest(testBucketName)) using (BucketDeleteResponse response = service.BucketDelete(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Deleting Bucket " + testBucketName2 + " -----"); using (BucketDeleteRequest request = new BucketDeleteRequest(testBucketName2)) using (BucketDeleteResponse response = service.BucketDelete(request)) { } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\n----- Listing All My Buckets -----"); using (BucketListRequest request = new BucketListRequest(null)) using (BucketListResponse response = service.BucketList(request)) { Console.WriteLine(response.StreamResponseToString()); } Console.WriteLine("\npress enter >"); Console.ReadLine(); Console.WriteLine("\nTotal data transfers: " + service.GetTransfers().Length.ToString()); Console.WriteLine("Total bytes uploaded: " + service.GetTotalBytesUploaded().ToString()); Console.WriteLine("Total bytes downloaded: " + service.GetTotalBytesDownloaded().ToString()); Console.WriteLine("\npress enter >"); Console.ReadLine(); }
public void OnFileRequested(HttpRequest request, IDirectory directory) { //request.Response.SetHeader("Content-Type", "text/plain; charset=utf-8"); request.Response.ResponseContent = new MemoryStream(); StreamWriter textwriter = new StreamWriter(request.Response.ResponseContent); SecondLife client; AvatarTracker avatars; Events events; StreamReader reader = new StreamReader(request.PostData); string qstring = reader.ReadToEnd(); reader.Dispose(); Dictionary<string,string> POST = AjaxLife.PostDecode(qstring); // Pull out the session. if (!POST.ContainsKey("sid")) { textwriter.WriteLine("Need an SID."); textwriter.Flush(); return; } Guid guid = new Guid(POST["sid"]); User user = new User(); lock (this.users) { if (!this.users.ContainsKey(guid)) { textwriter.WriteLine("Error: invalid SID"); textwriter.Flush(); return; } user = this.users[guid]; client = user.Client; avatars = user.Avatars; events = user.Events; user.LastRequest = DateTime.Now; } // Get the message type. string messagetype = POST["MessageType"]; // Check that the message is signed if it should be. if (Array.IndexOf(REQUIRED_SIGNATURES, messagetype) > -1) { if (!VerifySignature(user, qstring)) { textwriter.WriteLine("Error: Received hash and expected hash do not match."); textwriter.Flush(); return; } } // Right. This file is fun. It takes information in POST paramaters and sends them to // the server in the appropriate format. Some will return data immediately, some will return // keys to data that will arrive in the message queue, some return nothing but you get // something in the message queue later, and some return nother ever. // // The joys of dealing with multiple bizarre message types. switch (messagetype) { case "SpatialChat": client.Self.Chat(POST["Message"], int.Parse(POST["Channel"]), (ChatType)((byte)int.Parse(POST["Type"]))); break; case "SimpleInstantMessage": if (POST.ContainsKey("IMSessionID")) { client.Self.InstantMessage(new LLUUID(POST["Target"]), POST["Message"], new LLUUID(POST["IMSessionID"])); } else { client.Self.InstantMessage(new LLUUID(POST["Target"]), POST["Message"]); } break; case "GenericInstantMessage": client.Self.InstantMessage( client.Self.FirstName + " " + client.Self.LastName, new LLUUID(POST["Target"]), POST["Message"], new LLUUID(POST["IMSessionID"]), (InstantMessageDialog)((byte)int.Parse(POST["Dialog"])), (InstantMessageOnline)int.Parse(POST["Online"]), client.Self.SimPosition, client.Network.CurrentSim.ID, new byte[0]); break; case "NameLookup": client.Avatars.RequestAvatarName(new LLUUID(POST["ID"])); break; case "Teleport": { Hashtable hash = new Hashtable(); bool status; if (POST.ContainsKey("Landmark")) { status = client.Self.Teleport(new LLUUID(POST["Landmark"])); } else { status = client.Self.Teleport(POST["Sim"], new LLVector3(float.Parse(POST["X"]), float.Parse(POST["Y"]), float.Parse(POST["Z"]))); } if (status) { hash.Add("Success", true); hash.Add("Sim", client.Network.CurrentSim.Name); hash.Add("Position", client.Self.SimPosition); } else { hash.Add("Success", false); hash.Add("Reason", client.Self.TeleportMessage); } textwriter.WriteLine(MakeJson.FromHashtable(hash)); } break; case "GoHome": client.Self.GoHome(); break; case "GetPosition": { Hashtable hash = new Hashtable(); hash.Add("Sim", client.Network.CurrentSim.Name); hash.Add("Position", client.Self.SimPosition); textwriter.WriteLine(JavaScriptConvert.SerializeObject(hash)); } break; case "RequestBalance": client.Self.RequestBalance(); break; case "GetStats": { Hashtable hash = new Hashtable(); hash.Add("FPS", client.Network.CurrentSim.Stats.FPS); hash.Add("TimeDilation", client.Network.CurrentSim.Stats.Dilation); hash.Add("LSLIPS", client.Network.CurrentSim.Stats.LSLIPS); hash.Add("Objects", client.Network.CurrentSim.Stats.Objects); hash.Add("ActiveScripts", client.Network.CurrentSim.Stats.ActiveScripts); hash.Add("Agents", client.Network.CurrentSim.Stats.Agents); hash.Add("ChildAgents", client.Network.CurrentSim.Stats.ChildAgents); hash.Add("AjaxLifeSessions", users.Count); hash.Add("TextureCacheCount", AjaxLife.TextureCacheCount); hash.Add("TextureCacheSize", AjaxLife.TextureCacheSize); textwriter.WriteLine(MakeJson.FromHashtable(hash)); } break; case "TeleportLureRespond": client.Self.TeleportLureRespond(new LLUUID(POST["RequesterID"]), bool.Parse(POST["Accept"])); break; case "GodlikeTeleportLureRespond": { LLUUID lurer = new LLUUID(POST["RequesterID"]); LLUUID session = new LLUUID(POST["SessionID"]); client.Self.InstantMessage(client.Self.Name, lurer, "", LLUUID.Random(), InstantMessageDialog.AcceptTeleport, InstantMessageOnline.Offline, client.Self.SimPosition, LLUUID.Zero, new byte[0]); TeleportLureRequestPacket lure = new TeleportLureRequestPacket(); lure.Info.AgentID = client.Self.AgentID; lure.Info.SessionID = client.Self.SessionID; lure.Info.LureID = session; lure.Info.TeleportFlags = (uint)AgentManager.TeleportFlags.ViaGodlikeLure; client.Network.SendPacket(lure); } break; case "FindPeople": { Hashtable hash = new Hashtable(); hash.Add("QueryID", client.Directory.StartPeopleSearch(DirectoryManager.DirFindFlags.People, POST["Search"], int.Parse(POST["Start"]))); textwriter.WriteLine(MakeJson.FromHashtable(hash)); } break; case "FindGroups": { Hashtable hash = new Hashtable(); hash.Add("QueryID", client.Directory.StartGroupSearch(DirectoryManager.DirFindFlags.Groups, POST["Search"], int.Parse(POST["Start"]))); textwriter.WriteLine(MakeJson.FromHashtable(hash)); } break; case "GetAgentData": client.Avatars.RequestAvatarProperties(new LLUUID(POST["AgentID"])); break; case "StartAnimation": client.Self.AnimationStart(new LLUUID(POST["Animation"]), false); break; case "StopAnimation": client.Self.AnimationStop(new LLUUID(POST["Animation"]), true); break; case "SendAppearance": client.Appearance.SetPreviousAppearance(false); break; case "GetMapItems": { MapItemRequestPacket req = new MapItemRequestPacket(); req.AgentData.AgentID = client.Self.AgentID; req.AgentData.SessionID = client.Self.SessionID; GridRegion region; client.Grid.GetGridRegion(POST["Region"], GridLayerType.Objects, out region); req.RequestData.RegionHandle = region.RegionHandle; req.RequestData.ItemType = uint.Parse(POST["ItemType"]); client.Network.SendPacket((Packet)req); } break; case "GetMapBlocks": { MapBlockRequestPacket req = new MapBlockRequestPacket(); req.AgentData.AgentID = client.Self.AgentID; req.AgentData.SessionID = client.Self.SessionID; req.PositionData.MinX = 0; req.PositionData.MinY = 0; req.PositionData.MaxX = ushort.MaxValue; req.PositionData.MaxY = ushort.MaxValue; client.Network.SendPacket((Packet)req); } break; case "GetMapBlock": { ushort x = ushort.Parse(POST["X"]); ushort y = ushort.Parse(POST["Y"]); MapBlockRequestPacket req = new MapBlockRequestPacket(); req.AgentData.AgentID = client.Self.AgentID; req.AgentData.SessionID = client.Self.SessionID; req.PositionData.MinX = x; req.PositionData.MinY = y; req.PositionData.MaxX = x; req.PositionData.MaxY = y; client.Network.SendPacket((Packet)req); } break; case "GetOfflineMessages": { RetrieveInstantMessagesPacket req = new RetrieveInstantMessagesPacket(); req.AgentData.AgentID = client.Self.AgentID; req.AgentData.SessionID = client.Self.SessionID; client.Network.SendPacket((Packet)req); } break; case "GetFriendList": { InternalDictionary<LLUUID, FriendInfo> friends = client.Friends.FriendList; List<Hashtable> friendlist = new List<Hashtable>(); friends.ForEach(delegate(FriendInfo friend) { Hashtable friendhash = new Hashtable(); friendhash.Add("ID", friend.UUID.ToString()); friendhash.Add("Name", friend.Name); friendhash.Add("Online", friend.IsOnline); friendhash.Add("MyRights", friend.MyFriendRights); friendhash.Add("TheirRights", friend.TheirFriendRights); friendlist.Add(friendhash); }); textwriter.Write(MakeJson.FromObject(friendlist)); } break; case "ChangeRights": { LLUUID uuid = new LLUUID(POST["Friend"]); client.Friends.GrantRights(uuid, (FriendRights)int.Parse(POST["Rights"])); } break; case "RequestLocation": client.Friends.MapFriend(new LLUUID(POST["Friend"])); break; case "RequestTexture": { // This one's confusing, so it gets some comments. // First, we get the image's UUID. LLUUID image = new LLUUID(POST["ID"]); // We prepare a query to ask if S3 has it. HEAD only to avoid wasting // GET requests and bandwidth. bool exists = false; // If we already know we have it, note this. if (AjaxLife.CachedTextures.Contains(image)) { exists = true; } else { // If we're using S3, check the S3 bucket if (AjaxLife.USE_S3) { // Otherwise, make that HEAD request and find out. try { IThreeSharp query = new ThreeSharpQuery(AjaxLife.S3Config); Affirma.ThreeSharp.Model.ObjectGetRequest s3request = new Affirma.ThreeSharp.Model.ObjectGetRequest(AjaxLife.TEXTURE_BUCKET, image.ToString() + ".png"); s3request.Method = "HEAD"; Affirma.ThreeSharp.Model.ObjectGetResponse s3response = query.ObjectGet(s3request); if (s3response.StatusCode == System.Net.HttpStatusCode.OK) { exists = true; } s3response.DataStream.Close(); } catch { } } // If we aren't using S3, just check the texture cache. else { exists = File.Exists(AjaxLife.TEXTURE_CACHE + image.ToString() + ".png"); } } // If it exists, reply with Ready = true and the URL to find it at. if (exists) { textwriter.Write("{Ready: true, URL: \"" + AjaxLife.TEXTURE_ROOT + image + ".png\"}"); } // If it doesn't, request the image from SL and note its lack of readiness. // Notification will arrive later in the message queue. else { client.Assets.RequestImage(image, ImageType.Normal, 125000.0f, 0); textwriter.Write("{Ready: false}"); } } break; case "AcceptFriendship": client.Friends.AcceptFriendship(client.Self.AgentID, POST["IMSessionID"]); break; case "DeclineFriendship": client.Friends.DeclineFriendship(client.Self.AgentID, POST["IMSessionID"]); break; case "OfferFriendship": client.Friends.OfferFriendship(new LLUUID(POST["Target"])); break; case "TerminateFriendship": client.Friends.TerminateFriendship(new LLUUID(POST["Target"])); break; case "SendAgentMoney": client.Self.GiveAvatarMoney(new LLUUID(POST["Target"]), int.Parse(POST["Amount"])); break; case "RequestAvatarList": { List<Hashtable> list = new List<Hashtable>(); foreach (KeyValuePair<uint, Avatar> pair in avatars.Avatars) { Avatar avatar = pair.Value; Hashtable hash = new Hashtable(); hash.Add("Name", avatar.Name); hash.Add("ID", avatar.ID); hash.Add("LocalID", avatar.LocalID); hash.Add("Position", avatar.Position); //hash.Add("Rotation", avatar.Rotation); hash.Add("Scale", avatar.Scale); hash.Add("GroupName", avatar.GroupName); list.Add(hash); } textwriter.Write(MakeJson.FromObject(list)); } break; case "LoadInventoryFolder": client.Inventory.RequestFolderContents(new LLUUID(POST["UUID"]), client.Self.AgentID, true, true, InventorySortOrder.ByDate | InventorySortOrder.SystemFoldersToTop); break; case "RequestAsset": { try { LLUUID transferid = client.Assets.RequestInventoryAsset(new LLUUID(POST["AssetID"]), new LLUUID(POST["InventoryID"]), LLUUID.Zero, new LLUUID(POST["OwnerID"]), (AssetType)int.Parse(POST["AssetType"]), false); textwriter.Write("{TransferID: \"" + transferid + "\"}"); } catch // Try catching the error that sometimes gets thrown... but sometimes doesn't. { } } break; case "SendTeleportLure": client.Self.SendTeleportLure(new LLUUID(POST["Target"]), POST["Message"]); break; case "ScriptPermissionResponse": client.Self.ScriptQuestionReply(client.Network.CurrentSim, new LLUUID(POST["ItemID"]), new LLUUID(POST["TaskID"]), (ScriptPermission)int.Parse(POST["Permissions"])); break; case "ScriptDialogReply": { ScriptDialogReplyPacket packet = new ScriptDialogReplyPacket(); packet.AgentData.AgentID = client.Self.AgentID; packet.AgentData.SessionID = client.Self.SessionID; packet.Data.ButtonIndex = int.Parse(POST["ButtonIndex"]); packet.Data.ButtonLabel = Helpers.StringToField(POST["ButtonLabel"]); packet.Data.ChatChannel = int.Parse(POST["ChatChannel"]); packet.Data.ObjectID = new LLUUID(POST["ObjectID"]); client.Network.SendPacket((Packet)packet); } break; case "SaveNotecard": client.Inventory.RequestUploadNotecardAsset(Helpers.StringToField(POST["AssetData"]), new LLUUID(POST["ItemID"]), new InventoryManager.NotecardUploadedAssetCallback(events.Inventory_OnNoteUploaded)); break; case "CreateInventory": client.Inventory.RequestCreateItem(new LLUUID(POST["Folder"]), POST["Name"], POST["Description"], (AssetType)int.Parse(POST["AssetType"]), LLUUID.Random(), (InventoryType)int.Parse(POST["InventoryType"]), PermissionMask.All, new InventoryManager.ItemCreatedCallback(events.Inventory_OnItemCreated)); break; case "CreateFolder": { LLUUID folder = client.Inventory.CreateFolder(new LLUUID(POST["Parent"]), POST["Name"]); textwriter.Write("{FolderID: \"" + folder + "\"}"); } break; case "EmptyTrash": client.Inventory.EmptyTrash(); break; case "MoveItem": client.Inventory.MoveItem(new LLUUID(POST["Item"]), new LLUUID(POST["TargetFolder"]), POST["NewName"]); break; case "MoveFolder": client.Inventory.MoveFolder(new LLUUID(POST["Folder"]), new LLUUID(POST["NewParent"])); break; case "MoveItems": case "MoveFolders": { Dictionary<LLUUID, LLUUID> dict = new Dictionary<LLUUID, LLUUID>(); string[] moves = POST["ToMove"].Split(','); for (int i = 0; i < moves.Length; ++i) { string[] move = moves[i].Split(' '); dict.Add(new LLUUID(move[0]), new LLUUID(move[1])); } if (messagetype == "MoveItems") { client.Inventory.MoveItems(dict); } else if (messagetype == "MoveFolders") { client.Inventory.MoveFolders(dict); } } break; case "DeleteItem": client.Inventory.RemoveItem(new LLUUID(POST["Item"])); break; case "DeleteFolder": client.Inventory.RemoveFolder(new LLUUID(POST["Folder"])); break; case "DeleteMultiple": { string[] items = POST["Items"].Split(','); List<LLUUID> itemlist = new List<LLUUID>(); for (int i = 0; i < items.Length; ++i) { itemlist.Add(new LLUUID(items[i])); } string[] folders = POST["Folders"].Split(','); List<LLUUID> folderlist = new List<LLUUID>(); for (int i = 0; i < items.Length; ++i) { folderlist.Add(new LLUUID(folders[i])); } client.Inventory.Remove(itemlist, folderlist); } break; case "GiveInventory": { client.Inventory.GiveItem(new LLUUID(POST["ItemID"]), POST["ItemName"], (AssetType)int.Parse(POST["AssetType"]), new LLUUID(POST["Recipient"]), true); } break; case "UpdateItem": { InventoryItem item = client.Inventory.FetchItem(new LLUUID(POST["ItemID"]), new LLUUID(POST["OwnerID"]), 1000); if (POST.ContainsKey("Name")) item.Name = POST["Name"]; if (POST.ContainsKey("Description")) item.Description = POST["Description"]; if (POST.ContainsKey("NextOwnerMask")) item.Permissions.NextOwnerMask = (PermissionMask)uint.Parse(POST["NextOwnerMask"]); if (POST.ContainsKey("SalePrice")) item.SalePrice = int.Parse(POST["SalePrice"]); if (POST.ContainsKey("SaleType")) item.SaleType = (SaleType)int.Parse(POST["SaleType"]); // This should be byte.Parse, but this upsets mono's compiler (CS1002) client.Inventory.RequestUpdateItem(item); } break; case "UpdateFolder": { UpdateInventoryFolderPacket packet = new UpdateInventoryFolderPacket(); packet.AgentData.AgentID = client.Self.AgentID; packet.AgentData.SessionID = client.Self.SessionID; packet.FolderData = new UpdateInventoryFolderPacket.FolderDataBlock[1]; packet.FolderData[0] = new UpdateInventoryFolderPacket.FolderDataBlock(); packet.FolderData[0].FolderID = new LLUUID(POST["FolderID"]); packet.FolderData[0].ParentID = new LLUUID(POST["ParentID"]); packet.FolderData[0].Type = sbyte.Parse(POST["Type"]); packet.FolderData[0].Name = Helpers.StringToField(POST["Name"]); client.Network.SendPacket((Packet)packet); } break; case "FetchItem": client.Inventory.FetchItem(new LLUUID(POST["Item"]), new LLUUID(POST["Owner"]), 5000); break; case "ReRotate": user.Rotation = -Math.PI; break; case "StartGroupIM": AjaxLife.Debug("SendMessage", "RequestJoinGroupChat(" + POST["Group"] + ")"); client.Self.RequestJoinGroupChat(new LLUUID(POST["Group"])); break; case "GroupInstantMessage": client.Self.InstantMessageGroup(new LLUUID(POST["Group"]), POST["Message"]); break; case "RequestGroupProfile": client.Groups.RequestGroupProfile(new LLUUID(POST["Group"])); break; case "RequestGroupMembers": client.Groups.RequestGroupMembers(new LLUUID(POST["Group"])); break; case "RequestGroupName": client.Groups.RequestGroupName(new LLUUID(POST["ID"])); break; case "JoinGroup": client.Groups.RequestJoinGroup(new LLUUID(POST["Group"])); break; case "LeaveGroup": client.Groups.LeaveGroup(new LLUUID(POST["Group"])); break; case "RequestCurrentGroups": client.Groups.RequestCurrentGroups(); break; case "GetParcelID": textwriter.Write("{LocalID: "+client.Parcels.GetParcelLocalID(client.Network.CurrentSim, new LLVector3(float.Parse(POST["X"]), float.Parse(POST["Y"]), float.Parse(POST["Z"])))+"}"); break; case "RequestParcelProperties": client.Parcels.PropertiesRequest(client.Network.CurrentSim, int.Parse(POST["LocalID"]), int.Parse(POST["SequenceID"])); break; } textwriter.Flush(); }