From 8c05b81d6860d8e0da4098cc6f59f630d7c53037 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Tue, 25 Mar 2008 16:29:54 +0000 Subject: * Committing Lulurun's Cgi/Perl implementation of the UGAI servers. * I love you long time. --- share/perl/lib/OpenSim/InventoryServer.pm | 249 ++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 share/perl/lib/OpenSim/InventoryServer.pm (limited to 'share/perl/lib/OpenSim/InventoryServer.pm') diff --git a/share/perl/lib/OpenSim/InventoryServer.pm b/share/perl/lib/OpenSim/InventoryServer.pm new file mode 100644 index 0000000..184e19a --- /dev/null +++ b/share/perl/lib/OpenSim/InventoryServer.pm @@ -0,0 +1,249 @@ +package OpenSim::InventoryServer; + +use strict; +use XML::Serializer; +use OpenSim::Utility; +use OpenSim::Config; +use OpenSim::InventoryServer::Config; +use OpenSim::InventoryServer::InventoryManager; + +my $METHOD_LIST = undef; + +sub getHandlerList { + if (!$METHOD_LIST) { + my %list = ( + "GetInventory" => \&_get_inventory, + "CreateInventory" => \&_create_inventory, + "NewFolder" => \&_new_folder, + "MoveFolder" => \&_move_folder, + "NewItem" => \&_new_item, + "DeleteItem" => \&_delete_item, + "RootFolders" => \&_root_folders, + ); + $METHOD_LIST = \%list; + } + return $METHOD_LIST; +} + +# ################# +# Handlers +sub _get_inventory { + my $post_data = shift; + my $uuid = &_get_uuid($post_data); + my $inventry_folders = &OpenSim::InventoryServer::InventoryManager::getUserInventoryFolders($uuid); + my @response_folders = (); + foreach (@$inventry_folders) { + my $folder = &_convert_to_response_folder($_); + push @response_folders, $folder; + } + my $inventry_items = &OpenSim::InventoryServer::InventoryManager::getUserInventoryItems($uuid); + my @response_items = (); + foreach (@$inventry_items) { + my $item = &_convert_to_response_item($_); + push @response_items, $item; + } + my $response_obj = { + Folders => { InventoryFolderBase => \@response_folders }, + AllItems => { InventoryItemBase => \@response_items }, + UserID => { UUID => $uuid }, + }; + my $serializer = new XML::Serializer( $response_obj, "InventoryCollection"); + return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO: +} + +sub _create_inventory { + my $post_data = shift; + my $uuid = &_get_uuid($post_data); + my $InventoryFolders = &_create_default_inventory($uuid); + foreach (@$InventoryFolders) { + &OpenSim::InventoryServer::InventoryManager::saveInventoryFolder($_); + } + my $serializer = new XML::Serializer("true", "boolean"); + return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO: +} + +sub _new_folder { + my $post_data = shift; + my $request_obj = &OpenSim::Utility::XML2Obj($post_data); + my $folder = &_convert_to_db_folder($request_obj); + &OpenSim::InventoryServer::InventoryManager::saveInventoryFolder($folder); + my $serializer = new XML::Serializer("true", "boolean"); + return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO: +} + +sub _move_folder { + my $post_data = shift; + my $request_info = &OpenSim::Utility::XML2Obj($post_data); + &OpenSim::InventoryServer::InventoryManager::moveInventoryFolder($request_info); + my $serializer = new XML::Serializer("true", "boolean"); + return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO: +} + +sub _new_item { + my $post_data = shift; + my $request_obj = &OpenSim::Utility::XML2Obj($post_data); + my $item = &_convert_to_db_item($request_obj); + &OpenSim::InventoryServer::InventoryManager::saveInventoryItem($item); + my $serializer = new XML::Serializer("true", "boolean"); + return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO: +} + +sub _delete_item { + my $post_data = shift; + my $request_obj = &OpenSim::Utility::XML2Obj($post_data); + my $item_id = $request_obj->{inventoryID}->{UUID}; + &OpenSim::InventoryServer::InventoryManager::deleteInventoryItem($item_id); + my $serializer = new XML::Serializer("true", "boolean"); + return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO: +} + +sub _root_folders { + my $post_data = shift; + my $uuid = &_get_uuid($post_data); + my $response = undef; + my $inventory_root_folder = &OpenSim::InventoryServer::InventoryManager::getRootFolder($uuid); + if ($inventory_root_folder) { + my $root_folder_id = $inventory_root_folder->{folderID}; + my $root_folder = &_convert_to_response_folder($inventory_root_folder); + my $root_folders = &OpenSim::InventoryServer::InventoryManager::getChildrenFolders($root_folder_id); + my @folders = ($root_folder); + foreach(@$root_folders) { + my $folder = &_convert_to_response_folder($_); + push @folders, $folder; + } + $response = { InventoryFolderBase => \@folders }; + } else { + $response = ""; # TODO: need better failed message + } + my $serializer = new XML::Serializer($response, "ArrayOfInventoryFolderBase"); + return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO: +} + +# ################# +# subfunctions +sub _convert_to_db_item { + my $item = shift; + my $ret = { + inventoryID => $item->{inventoryID}->{UUID}, + assetID => $item->{assetID}->{UUID}, + assetType => $item->{assetType}, + invType => $item->{invType}, + parentFolderID => $item->{parentFolderID}->{UUID}, + avatarID => $item->{avatarID}->{UUID}, + creatorID => $item->{creatorsID}->{UUID}, # TODO: human error ??? + inventoryName => $item->{inventoryName}, + inventoryDescription => $item->{inventoryDescription} || "", + inventoryNextPermissions => $item->{inventoryNextPermissions}, + inventoryCurrentPermissions => $item->{inventoryCurrentPermissions}, + inventoryBasePermissions => $item->{inventoryBasePermissions}, + inventoryEveryOnePermissions => $item->{inventoryEveryOnePermissions}, + }; + return $ret; +} + +sub _convert_to_response_item { + my $item = shift; + my $ret = { + inventoryID => { UUID => $item->{inventoryID} }, + assetID => { UUID => $item->{assetID} }, + assetType => $item->{assetType}, + invType => $item->{invType}, + parentFolderID => { UUID => $item->{parentFolderID} }, + avatarID => { UUID => $item->{avatarID} }, + creatorsID => { UUID => $item->{creatorID} }, # TODO: human error ??? + inventoryName => $item->{inventoryName}, + inventoryDescription => $item->{inventoryDescription} || "", + inventoryNextPermissions => $item->{inventoryNextPermissions}, + inventoryCurrentPermissions => $item->{inventoryCurrentPermissions}, + inventoryBasePermissions => $item->{inventoryBasePermissions}, + inventoryEveryOnePermissions => $item->{inventoryEveryOnePermissions}, + }; + return $ret; +} + +sub _convert_to_db_folder { + my $folder = shift; + my $ret = { + folderName => $folder->{name}, + agentID => $folder->{agentID}->{UUID}, + parentFolderID => $folder->{parentID}->{UUID}, + folderID => $folder->{folderID}->{UUID}, + type => $folder->{type}, + version => $folder->{version}, + }; + return $ret; +} + +sub _convert_to_response_folder { + my $folder = shift; + my $ret = { + name => $folder->{folderName}, + agentID => { UUID => $folder->{agentID} }, + parentID => { UUID => $folder->{parentFolderID} }, + folderID => { UUID => $folder->{folderID} }, + type => $folder->{type}, + version => $folder->{version}, + }; + return $ret; +} + +sub _create_default_inventory { + my $uuid = shift; + + my @InventoryFolders = (); + my $root_folder_id = &OpenSim::Utility::GenerateUUID(); + + push @InventoryFolders, { + "folderID" => $root_folder_id, + "agentID" => $uuid, + "parentFolderID" => &OpenSim::Utility::ZeroUUID(), + "folderName" => "My Inventory", + "type" => 8, + "version" => 1, + }; + + push @InventoryFolders, { + "folderID" => &OpenSim::Utility::GenerateUUID(), + "agentID" => $uuid, + "parentFolderID" => $root_folder_id, + "folderName" => "Textures", + "type" => 0, + "version" => 1, + }; + + push @InventoryFolders, { + "folderID" => &OpenSim::Utility::GenerateUUID(), + "agentID" => $uuid, + "parentFolderID" => $root_folder_id, + "folderName" => "Objects", + "type" => 6, + "version" => 1, + }; + + push @InventoryFolders, { + "folderID" => &OpenSim::Utility::GenerateUUID(), + "agentID" => $uuid, + "parentFolderID" => $root_folder_id, + "folderName" => "Clothes", + "type" => 5, + "version" => 1, + }; + + return \@InventoryFolders; +} + + +# ################# +# Utilities +sub _get_uuid { + my $data = shift; + if ($data =~ /([^<]+)<\/guid>/) { + return $1; + } else { + Carp::croak("can not find uuid: $data"); + } +} + + +1; + -- cgit v1.1