123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- 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\s*>([^<]+)<\/guid>/) {
- return $1;
- } else {
- Carp::croak("can not find uuid: $data");
- }
- }
- 1;
|