Remove old Flickr snapshot option from Exodus

Ansariel 2015-01-11 18:49:41 +01:00
parent 1f465086c0
commit ac4dd8f077
21 changed files with 0 additions and 1493 deletions

View File

@ -126,10 +126,7 @@ set(viewer_SOURCE_FILES
chatbar_as_cmdline.cpp
daeexport.cpp
dialogstack.cpp
exoflickr.cpp
exoflickrauth.cpp
exogroupmutelist.cpp
exopanelsnapshotflickr.cpp
exopostprocess.cpp
floatermedialists.cpp
fsareasearch.cpp
@ -847,8 +844,6 @@ set(viewer_HEADER_FILES
chatbar_as_cmdline.h
daeexport.h
dialogstack.h
exoflickr.h
exoflickrauth.h
exogroupmutelist.h
exopostprocess.h
floatermedialists.h
@ -1539,16 +1534,6 @@ set(viewer_HEADER_FILES
NACLfloaterexploresounds.h
)
# <exodus>
# Generate the flickr keys header.
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/exoflickrkeys.h.in
${CMAKE_CURRENT_BINARY_DIR}/exoflickrkeys.h
@ONLY
)
list(APPEND viewer_HEADER_FILES ${CMAKE_CURRENT_BINARY_DIR}/exoflickrkeys.h)
# </exodus>
# <FS:TS> Generate the version information header file.
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/fsversionvalues.h.in

View File

@ -7551,17 +7551,6 @@
<key>Value</key>
<integer>4</integer>
</map>
<key>LastSnapshotToFlickrResolution</key>
<map>
<key>Comment</key>
<string>At what resolution should snapshots be taken for Flickr upload. 0=Current Window, 1=320x240, 2=640x480, 3=800x600, 4=1024x768, 5=1280x1024, 6=1600x1200, 7=Custom</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>4</integer>
</map>
<key>SnapshotToDiskQuality</key>
<map>
<key>Comment</key>
@ -14335,17 +14324,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>FlickrSnapshotFormat</key>
<map>
<key>Comment</key>
<string>Save snapshots for Flickr in this format (0 = PNG, 1 = JPEG, 2 = BMP)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotQuality</key>
<map>
<key>Comment</key>
@ -20135,50 +20113,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<string>Grey</string>
</map>
<key>ExodusFlickrLastTags</key>
<map>
<key>Comment</key>
<string>Pre-filled tags for Flickr uploads</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>"Second Life"</string>
</map>
<key>ExodusFlickrLastRating</key>
<map>
<key>Comment</key>
<string>Last rating for Flickr upload. 1 = safe, 2 = moderate, 3 = restricted</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ExodusFlickrShowPosition</key>
<map>
<key>Comment</key>
<string>Whether to tag a Flickr upload with the location at which it was taken.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ExodusFlickrIncludeSLURL</key>
<map>
<key>Comment</key>
<string>If showing the position of an image, whether an SLurl should be appended to the description.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSReleaseCandidateChannelId</key>
<map>
<key>Comment</key>

View File

@ -776,63 +776,6 @@
</map>
<!-- End of Firestorm settings -->
<!-- Settings imported from Exodus -->
<key>ExodusFlickrToken</key>
<map>
<key>Comment</key>
<string>Flickr OAuth Token</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<key>ExodusFlickrTokenSecret</key>
<map>
<key>Comment</key>
<string>Flickr OAuth Token Secret</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<key>ExodusFlickrNSID</key>
<map>
<key>Comment</key>
<string>Flickr User ID</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<key>ExodusFlickrUsername</key>
<map>
<key>Comment</key>
<string>Flickr Username</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<key>ExodusFlickrFullName</key>
<map>
<key>Comment</key>
<string>Flickr Username</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
</map>
<!-- End of settings imported from Exodus -->
<key>FSStoredCameraPos</key>
<map>
<key>Comment</key>

View File

@ -1,321 +0,0 @@
/**
* @file exoflickr
* @brief Lightweight wrapper around the Flickr API for signing and such
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Copyright (C) 2012 Katharine Berry
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llbufferstream.h"
#include "lluri.h"
#include "llhttpclient.h"
#include "llxmltree.h"
#include "llsdserialize.h"
#include "llviewercontrol.h"
#include "llbase64.h"
// third-party
#if LL_STANDALONE
#include "jsoncpp/reader.h" // JSON
#else
#include "reader.h" // JSON
#endif
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include "exoflickr.h"
class exoFlickrResponse : public LLHTTPClient::Responder
{
public:
exoFlickrResponse(exoFlickr::response_callback_t &callback);
/* virtual */ void completedRaw(
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer);
private:
exoFlickr::response_callback_t mCallback;
};
class exoFlickrUploadResponse : public LLHTTPClient::Responder
{
public:
exoFlickrUploadResponse(exoFlickr::response_callback_t &callback);
/* virtual */ void completedRaw(
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer);
private:
exoFlickr::response_callback_t mCallback;
};
//static
void exoFlickr::request(const std::string& method, const LLSD& args, response_callback_t callback)
{
LLSD params(args);
params["format"] = "json";
params["method"] = method;
params["nojsoncallback"] = 1;
signRequest(params, "GET", "https://api.flickr.com/services/rest/");
LLHTTPClient::get("https://api.flickr.com/services/rest/", params, new exoFlickrResponse(callback));
}
void exoFlickr::signRequest(LLSD& params, std::string method, std::string url)
{
// Oauth junk
params["oauth_consumer_key"] = EXO_FLICKR_API_KEY;
std::string oauth_token = gSavedPerAccountSettings.getString("ExodusFlickrToken");
if(oauth_token.length())
{
params["oauth_token"] = oauth_token;
}
params["oauth_signature_method"] = "HMAC-SHA1";
params["oauth_timestamp"] = (LLSD::Integer)time(NULL);
params["oauth_nonce"] = ll_rand();
params["oauth_version"] = "1.0";
params["oauth_signature"] = getSignatureForCall(params, url, method); // This must be the last one set.
}
//static
void exoFlickr::uploadPhoto(const LLSD& args, LLImageFormatted *image, response_callback_t callback)
{
LLSD params(args);
signRequest(params, "POST", "https://up.flickr.com/services/upload/");
// It would be nice if there was an easy way to do multipart form data. Oh well.
const std::string boundary = "------------abcdefgh012345";
std::ostringstream post_stream;
post_stream << "--" << boundary;
// Add all the parameters from LLSD to the query.
for(LLSD::map_const_iterator itr = params.beginMap(); itr != params.endMap(); ++itr)
{
post_stream << "\r\nContent-Disposition: form-data; name=\"" << itr->first << "\"";
post_stream << "\r\n\r\n" << itr->second.asString();
post_stream << "\r\n" << "--" << boundary;
}
// Headers for the photo
post_stream << "\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"snapshot." << image->getExtension() << "\"";
post_stream << "\r\nContent-Type: ";
// Apparently LLImageFormatted doesn't know what mimetype it has.
if(image->getExtension() == "jpg")
{
post_stream << "image/jpeg";
}
else if(image->getExtension() == "png")
{
post_stream << "image/png";
}
else // This will (probably) only happen if someone decides to put the BMP entry back in the format selection floater.
{ // I wonder if Flickr would do the right thing.
post_stream << "application/x-wtf";
LL_WARNS("FlickrAPI") << "Uploading unknown image type." << LL_ENDL;
}
post_stream << "\r\n\r\n";
// Now we build the postdata array, including the photo in the middle of it.
std::string post_str = post_stream.str();
size_t total_data_size = image->getDataSize() + post_str.length() + boundary.length() + 6; // + 6 = "\r\n" + "--" + "--"
char* post_data = new char[total_data_size + 1];
memcpy(post_data, post_str.data(), post_str.length());
char* address = post_data + post_str.length();
memcpy(address, image->getData(), image->getDataSize());
address += image->getDataSize();
std::string post_tail = "\r\n--" + boundary + "--";
memcpy(address, post_tail.data(), post_tail.length());
address += post_tail.length();
llassert(address <= post_data + total_data_size /* After all that, check we didn't overrun */);
// We have a post body! Now we can go about building the actual request...
LLSD headers;
headers["Content-Type"] = "multipart/form-data; boundary=" + boundary;
// <FS:TS> Patch from Exodus:
// The default timeout (one minute) isn't enough for a large picture.
// 10 minutes is arbitrary, but should be long enough.
LLHTTPClient::postRaw("https://up.flickr.com/services/upload/", (U8*)post_data, total_data_size, new exoFlickrUploadResponse(callback), headers, 600);
// </FS:TS>
// The HTTP client takes ownership of our post_data array,
// and will delete it when it's done.
}
//static
std::string exoFlickr::getSignatureForCall(const LLSD& parameters, std::string url, std::string method)
{
std::vector<std::string> keys;
for(LLSD::map_const_iterator itr = parameters.beginMap(); itr != parameters.endMap(); ++itr)
{
keys.push_back(itr->first);
}
std::sort(keys.begin(), keys.end());
std::ostringstream q;
q << LLURI::escape(method);
q << "&" << LLURI::escape(url) << "&";
for(std::vector<std::string>::const_iterator itr = keys.begin(); itr != keys.end(); ++itr)
{
if(itr != keys.begin())
{
q << "%26";
}
q << LLURI::escape(*itr);
q << "%3D" << LLURI::escape(LLURI::escape(parameters[*itr]));
}
unsigned char data[EVP_MAX_MD_SIZE];
unsigned int length;
std::string key = std::string(EXO_FLICKR_API_SECRET) + "&" + gSavedPerAccountSettings.getString("ExodusFlickrTokenSecret");
std::string to_hash = q.str();
HMAC(EVP_sha1(), (void*)key.c_str(), key.length(), (unsigned char*)to_hash.c_str(), to_hash.length(), data, &length);
std::string signature = LLBase64::encode((U8*)data, length);
return signature;
}
exoFlickrUploadResponse::exoFlickrUploadResponse(exoFlickr::response_callback_t &callback)
: mCallback(callback)
{
}
void exoFlickrUploadResponse::completedRaw(
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
LLBufferStream istr(channels, buffer.get());
std::stringstream strstrm;
strstrm << istr.rdbuf();
std::string result = std::string(strstrm.str());
LLSD output;
bool success;
LLXmlTree tree;
if(!tree.parseString(result))
{
LL_WARNS("FlickrAPI") << "Couldn't parse flickr response(" << getStatus() << "): " << result << LL_ENDL;
mCallback(false, LLSD());
return;
}
LLXmlTreeNode* root = tree.getRoot();
if(!root->hasName("rsp"))
{
LL_WARNS("FlickrAPI") << "Bad root node: " << root->getName() << LL_ENDL;
mCallback(false, LLSD());
return;
}
std::string stat;
root->getAttributeString("stat", stat);
output["stat"] = stat;
if(stat == "ok")
{
success = true;
LLXmlTreeNode* photoid_node = root->getChildByName("photoid");
if(photoid_node)
{
output["photoid"] = photoid_node->getContents();
}
}
else
{
success = false;
LLXmlTreeNode* err_node = root->getChildByName("err");
if(err_node)
{
S32 code;
std::string msg;
err_node->getAttributeS32("code", code);
err_node->getAttributeString("msg", msg);
output["code"] = code;
output["msg"] = msg;
}
}
mCallback(success, output);
}
static void JsonToLLSD(const Json::Value &root, LLSD &output)
{
if(root.isObject())
{
Json::Value::Members keys = root.getMemberNames();
for(Json::Value::Members::const_iterator itr = keys.begin(); itr != keys.end(); ++itr)
{
LLSD elem;
JsonToLLSD(root[*itr], elem);
output[*itr] = elem;
}
}
else if(root.isArray())
{
for(Json::Value::const_iterator itr = root.begin(); itr != root.end(); ++itr)
{
LLSD elem;
JsonToLLSD(*itr, elem);
output.append(elem);
}
}
else
{
switch(root.type())
{
case Json::intValue:
output = root.asInt();
break;
case Json::realValue:
case Json::uintValue:
output = root.asDouble();
break;
case Json::stringValue:
output = root.asString();
break;
case Json::booleanValue:
output = root.asBool();
break;
case Json::nullValue:
output = LLSD();
break;
default:
break;
}
}
}
exoFlickrResponse::exoFlickrResponse(exoFlickr::response_callback_t &callback) :
mCallback(callback)
{
}
void exoFlickrResponse::completedRaw(
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
LLBufferStream istr(channels, buffer.get());
std::stringstream strstrm;
strstrm << istr.rdbuf();
std::string result = strstrm.str();
Json::Value root;
Json::Reader reader;
bool success = reader.parse(result, root);
if(!success)
{
mCallback(false, LLSD());
return;
}
else
{
LL_INFOS("FlickrAPI") << "Got response string: " << result << LL_ENDL;
LLSD response;
JsonToLLSD(root, response);
mCallback(isGoodStatus(), response);
}
}

View File

@ -1,44 +0,0 @@
/**
* @file exoflickr.h
* @brief Lightweight wrapper around the Flickr API for signing and such
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Copyright (C) 2012 Katharine Berry
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
* $/LicenseInfo$
*/
#ifndef EXOFLICKR_H
#define EXOFLICKR_H
#include "llimage.h"
#include "llsd.h"
#include <boost/bind.hpp>
// This include file defines the API key/secret.
// It is generated by cmake.
#include "exoflickrkeys.h"
class exoFlickr
{
public:
typedef boost::function<void(bool success, const LLSD& response)> response_callback_t;
static void request(const std::string& method, const LLSD& args, response_callback_t callback);
static void uploadPhoto(const LLSD& args, LLImageFormatted *image, response_callback_t callback);
static void signRequest(LLSD& params, std::string method, std::string url);
static std::string getSignatureForCall(const LLSD& parameters, std::string url, std::string method);
};
#endif

View File

@ -1,210 +0,0 @@
/**
* @file exoflickrauth.cpp
* @brief Handles all Flickr authentication issues
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Copyright (C) 2012 Katharine Berry
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llwindow.h"
#include "llviewerwindow.h"
#include "llbufferstream.h"
#include "lluri.h"
#include "llhttpclient.h"
#include "llviewercontrol.h"
#include "llnotificationsutil.h"
#include "exoflickr.h"
#include "exoflickrauth.h"
class exoFlickrAuthResponse : public LLHTTPClient::Responder
{
public:
exoFlickrAuthResponse(exoFlickrAuth::authorized_callback_t callback);
/* virtual */ void completedRaw(
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer);
private:
exoFlickrAuth::authorized_callback_t mCallback;
};
bool exoFlickrAuth::sAuthorisationInProgress = false;
exoFlickrAuth::exoFlickrAuth(authorized_callback_t callback)
: mCallback(callback)
{
// Avoid doubled authentication attempts.
if(sAuthorisationInProgress)
{
delete this;
return;
}
mAuthenticating = true;
sAuthorisationInProgress = true;
if(gSavedPerAccountSettings.getString("ExodusFlickrToken").empty() || gSavedPerAccountSettings.getString("ExodusFlickrTokenSecret").empty())
{
beginAuthorisation();
}
else
{
checkAuthorisation();
}
}
exoFlickrAuth::~exoFlickrAuth()
{
if(mAuthenticating)
{
sAuthorisationInProgress = false;
}
}
void exoFlickrAuth::checkAuthorisation()
{
exoFlickr::request("flickr.test.login", LLSD(), boost::bind(&exoFlickrAuth::checkResult, this, _1, _2));
}
void exoFlickrAuth::checkResult(bool success, const LLSD &response)
{
if(!success)
{
LL_WARNS("Flickr") << "Login test failed (HTTP). Reauthenticating." << LL_ENDL;
beginAuthorisation();
}
else
{
if(response["stat"].asString() != "ok")
{
LL_WARNS("Flickr") << "Login test failed: " << response["message"] << "(" << response["code"] << "). Reauthenticating." << LL_ENDL;
beginAuthorisation();
}
else
{
LL_INFOS("Flickr") << "Stored Flickr tokens are valid." << LL_ENDL;
mCallback(true, LLSD());
delete this;
return;
}
}
}
void exoFlickrAuth::beginAuthorisation()
{
// Explain and confirm the process to the user.
LLNotificationsUtil::add("ExodusFlickrVerificationExplanation", LLSD(), LLSD(), boost::bind(&exoFlickrAuth::explanationCallback, this, _1, _2));
}
void exoFlickrAuth::explanationCallback(const LLSD& notification, const LLSD& response)
{
int option = LLNotificationsUtil::getSelectedOption(notification, response);
if(option == 0) // OK
{
// Clear out any old authentication tokens
gSavedPerAccountSettings.setString("ExodusFlickrToken", "");
gSavedPerAccountSettings.setString("ExodusFlickrTokenSecret","");
// Initiate authentication step one.
LLSD params;
params["oauth_callback"] = "oob";
LL_INFOS("Flickr") << "Initialising OAuth authorisation process." << LL_ENDL;
exoFlickr::signRequest(params, "GET", "http://www.flickr.com/services/oauth/request_token");
LLHTTPClient::get("http://www.flickr.com/services/oauth/request_token", params, new exoFlickrAuthResponse(boost::bind(&exoFlickrAuth::gotRequestToken, this, _1, _2)));
}
else
{
mCallback(false, LLSD());
delete this;
return;
}
}
void exoFlickrAuth::gotRequestToken(bool success, const LLSD& params)
{
LL_INFOS("Flickr") << "Got request token, success = " << success << LL_ENDL;
if(!success)
{
mCallback(false, LLSD());
delete this;
return;
}
std::string token = params["oauth_token"].asString();
std::string secret = params["oauth_token_secret"].asString();
gSavedPerAccountSettings.setString("ExodusFlickrToken", token);
gSavedPerAccountSettings.setString("ExodusFlickrTokenSecret", secret);
LL_INFOS("Flickr") << "Token = '" << token << "', secret = '" << secret
<< "'" << LL_ENDL;
// Proceed with stage two.
// We spawn the browser using spawnWebBrowser instead of LLWeb to bypass the
// browser prompt. This would a) be redundant to our earlier notice, and b)
// is unclickable because we have also presented a modal dialog.
gViewerWindow->getWindow()->spawnWebBrowser("http://www.flickr.com/services/oauth/authorize?perms=write&oauth_token=" + token, true);
LLNotificationsUtil::add("ExodusFlickrVerificationPrompt", LLSD(), LLSD(), boost::bind(&exoFlickrAuth::gotVerifier, this, _1, _2));
}
void exoFlickrAuth::gotVerifier(const LLSD& notification, const LLSD& response)
{
int option = LLNotificationsUtil::getSelectedOption(notification, response);
if(option == 1) // Cancel
{
mCallback(false, LLSD());
delete this;
return;
}
// Proceed with stage three.
LLSD params;
params["oauth_verifier"] = response["oauth_verifier"];
exoFlickr::signRequest(params, "GET", "http://www.flickr.com/services/oauth/access_token");
LLHTTPClient::get("http://www.flickr.com/services/oauth/access_token", params, new exoFlickrAuthResponse(boost::bind(&exoFlickrAuth::gotAccessToken, this, _1, _2)));
}
void exoFlickrAuth::gotAccessToken(bool success, const LLSD& params)
{
if(success)
{
// Save all the information we got back.
gSavedPerAccountSettings.setString("ExodusFlickrToken", params["oauth_token"].asString());
gSavedPerAccountSettings.setString("ExodusFlickrTokenSecret", params["oauth_token_secret"].asString());
gSavedPerAccountSettings.setString("ExodusFlickrFullName", params["fullname"].asString());
gSavedPerAccountSettings.setString("ExodusFlickrNSID", params["user_nsid"].asString());
gSavedPerAccountSettings.setString("ExodusFlickrUsername", params["username"].asString());
mCallback(true, params);
}
else
{
LLNotificationsUtil::add("ExodusFlickrVerificationFailed");
mCallback(false, params);
}
delete this;
}
exoFlickrAuthResponse::exoFlickrAuthResponse(exoFlickrAuth::authorized_callback_t callback)
: mCallback(callback)
{
}
void exoFlickrAuthResponse::completedRaw(const LLChannelDescriptors& channels, const LLIOPipe::buffer_ptr_t& buffer)
{
LLBufferStream istr(channels, buffer.get());
std::ostringstream oss;
oss << istr.rdbuf();
std::string str = oss.str();
LLSD result = LLURI::queryMap(str);
mCallback((getStatus() == HTTP_OK), result);
}

View File

@ -1,45 +0,0 @@
/**
* @file exoflickrauth.h
* @brief Handles all Flickr authentication issues
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Copyright (C) 2012 Katharine Berry
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
* $/LicenseInfo$
*/
#include <boost/bind.hpp>
// This class's function is described by the flow chart at
// http://www.flickr.com/services/api/auth.oauth.html
class exoFlickrAuth
{
public:
typedef boost::function<void(bool success, const LLSD& params)> authorized_callback_t;
exoFlickrAuth(authorized_callback_t callback);
~exoFlickrAuth();
private:
authorized_callback_t mCallback;
bool mAuthenticating;
static bool sAuthorisationInProgress;
void beginAuthorisation();
void checkAuthorisation();
void checkResult(bool success, const LLSD& response);
void explanationCallback(const LLSD& notification, const LLSD& response);
void gotRequestToken(bool success, const LLSD& params); // Stage 1 response (HTTP)
void gotVerifier(const LLSD& notification, const LLSD& response); // Stage 2 response (LLNotification)
void gotAccessToken(bool success, const LLSD& params); // Stage 3 response (HTTP)
};

View File

@ -1,7 +0,0 @@
// THIS FILE IS AUTOGENERATED BY THE BUILD PROCESS
// You can either set the keys in Variables.cmake or at the autobuild command
// For Exodus release builds the latter is *required* to maintain the
// secrecy of the API keys.
#define EXO_FLICKR_API_KEY "@FLICKR_API_KEY@"
#define EXO_FLICKR_API_SECRET "@FLICKR_API_SECRET@"

View File

@ -649,9 +649,6 @@ with the same filename but different name
<texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" />
<texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" />
<texture name="Snapshot_Facebook" file_name="toolbar_icons/facebook.png" preload="false" />
<!-- <exodus> -->
<texture name="Snapshot_Exodus_Flickr" file_name="snapshot_flickr.png" preload="false" />
<!-- </exodus> -->
<texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_flickr_settings">
<combo_box label="Auflösung" name="flickr_size_combo">
<combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
<combo_box.item label="320x240" name="320x240"/>
<combo_box.item label="640x480" name="640x480"/>
<combo_box.item label="800x600" name="800x600"/>
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="1280x1024" name="1280x1024"/>
<combo_box.item label="1600x1200" name="1600x1200"/>
<combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<layout_stack name="flickr_image_params_ls">
<layout_panel name="flickr_image_size_lp">
<spinner label="Breite" name="flickr_snapshot_width"/>
<spinner label="Höhe" name="flickr_snapshot_height"/>
<check_box label="Seitenverhältnis beibehalten" name="flickr_keep_aspect_check"/>
</layout_panel>
<layout_panel name="flickr_image_format_quality_lp">
<combo_box label="Format" name="flickr_format_combo">
<combo_box.item label="PNG (verlustfrei)" name="PNG"/>
<combo_box.item label="JPEG" name="JPEG"/>
</combo_box>
<slider label="Bildqualität" name="image_quality_slider" label_width="65" width="165"/>
<text name="image_quality_level">
([QLVL])
</text>
</layout_panel>
</layout_stack>
</panel>

View File

@ -1,44 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_snapshot_flickr">
<string name="upload_message">
Hochladen...
</string>
<!-- <FS:TS> Removing extraneous icon and text, since we use a tab bar -->
<!--
<text name="title">
Flickr
</text>
<button label="Metadaten" name="metadata_btn"/>
<button label="Einstellungen" name="settings_btn"/>
-->
<tab_container name="flickr_panel_container">
<panel label="Metadaten" name="panel_flickr_metadata">
<text name="title_label">
Titel:
</text>
<text name="tags_label">
Tags:
</text>
<text name="rating_label">
Einstuf.:
</text>
<icons_combo_box label="Moderat" name="rating_combo">
<icons_combo_box.item label="Generell" name="Safe"/>
<icons_combo_box.item label="Moderat" name="Moderate"/>
<icons_combo_box.item label="Adult" name="Restricted"/>
</icons_combo_box>
<check_box name="location_check" label="Ort hinzuf."/>
<!-- bottom_delta="23" -->
<text name="description_label">
Beschreibung (optional):
</text>
<!-- <FS:TS> We don't use a cancel button on any other panel. -->
<!--
<button label="Abbrechen" name="cancel_btn"/>
-->
<!-- </FS:TS> -->
<button label="Hochladen" name="upload_btn"/>
</panel>
<panel label="Einstellungen" name="exo_panel_flickr_settings"/>
</tab_container>
</panel>

View File

@ -4610,32 +4610,6 @@ Soll [REMOVE_GRID] wirklich aus der Grid-Liste entfernt werden?
</notification>
<!-- </FS:AW grid management-->
<!-- <FS:TS> FIRE-5453: Flickr upload support (from Exodus) -->
<notification name="ExodusFlickrVerificationExplanation">
Um die Flickr-Uploadfunktion nutzen zu können, muss [APP_NAME] Zugriff auf deinen Account gewährt werden. Beim Fortfahren wird die Flickr-Website im Webbrowser geöffnet, wo du dich einloggen und den Zugriff durch [APP_NAME] autorisieren musst. Der daraufhin angezeigte Code muss in [APP_NAME] eingetragen werden.
Soll [APP_NAME] autorisiert werden, Fotos unter deinem Flickr-Konto zu posten?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification name="ExodusFlickrVerificationPrompt">
Bitte den Flickr-Zugriff im Webbrowser autorisieren und den angezeigen Code eingeben:
<form name="form">
<button name="OK" text="OK"/>
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
<notification name="ExodusFlickrVerificationFailed">
Flickr-Verifikation fehlgeschlagen. Bitte erneut versuchen sowie den eingegebenen Code überprüfen.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ExodusFlickrUploadComplete">
Das Foto kann jetzt [http://www.flickr.com/photos/upload/edit/?ids=[ID] hier] betrachtet werden.
</notification>
<!-- </FS:TS> FIRE-5453 -->
<notification name="FirstUseFlyOverride">
Warnung: Bitte verwende die Funktion zur Aufhebung der Flugbeschränkung verantwortungsvoll! Die Verwendung ohne die Zustimmung des Landeigentümers kann dazu führen, dass du von dem entsprechenden Land verbannt wirst.
</notification>

View File

@ -1,168 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
height="380"
layout="topleft"
name="panel_flickr_settings"
width="490">
<combo_box
follows="left|top|right"
height="23"
label="Resolution"
layout="topleft"
name="flickr_size_combo"
right="-10"
left="10"
top_pad="10">
<combo_box.item
label="Current Window"
name="CurrentWindow"
value="[i0,i0]" />
<combo_box.item
label="320x240"
name="320x240"
value="[i320,i240]" />
<combo_box.item
label="640x480"
name="640x480"
value="[i640,i480]" />
<combo_box.item
label="800x600"
name="800x600"
value="[i800,i600]" />
<combo_box.item
label="1024x768"
name="1024x768"
value="[i1024,i768]" />
<combo_box.item
label="1280x1024"
name="1280x1024"
value="[i1280,i1024]" />
<combo_box.item
label="1600x1200"
name="1600x1200"
value="[i1600,i1200]" />
<combo_box.item
label="Custom"
name="Custom"
value="[i-1,i-1]" />
</combo_box>
<layout_stack
animate="false"
follows="all"
height="345"
layout="bottomleft"
name="flickr_image_params_ls"
left_delta="0"
orientation="vertical"
top_pad="10"
right="-10">
<layout_panel
follows="top|left|right"
height="60"
layout="topleft"
left="0"
name="flickr_image_size_lp"
auto_resize="false"
top="0"
right="-1"
visible="true">
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Width"
label_width="40"
layout="topleft"
left="10"
max_val="6016"
min_val="32"
name="flickr_snapshot_width"
top_pad="10"
width="95" />
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Height"
label_width="40"
layout="topleft"
left_pad="5"
max_val="6016"
min_val="32"
name="flickr_snapshot_height"
top_delta="0"
width="95" />
<check_box
bottom_delta="20"
height="10"
follows="left|top"
label="Constrain proportions"
layout="topleft"
left="10"
name="flickr_keep_aspect_check" />
</layout_panel>
<layout_panel
follows="top|left|right"
height="23"
layout="topleft"
left="0"
name="flickr_image_format_quality_lp"
auto_resize="true"
top="0"
right="-1"
visible="true">
<combo_box
control_name="ExodusFlickrSnapshotFormat"
follows="left|top"
height="23"
label="Format"
layout="topleft"
left_delta="0"
name="flickr_format_combo"
top_pad="0"
width="120">
<combo_box.item
label="PNG (Lossless)"
name="PNG"
value="PNG" />
<combo_box.item
label="JPEG"
name="JPEG"
value="JPEG" />
</combo_box>
<slider
decimal_digits="0"
follows="left|top"
height="15"
increment="1"
initial_value="75"
label="Image quality"
label_width="80"
layout="topleft"
left="0"
max_val="100"
name="image_quality_slider"
top_pad="7"
width="200" />
<text
type="string"
follows="left|top"
font="SansSerifSmall"
length="1"
height="14"
layout="topleft"
left="95"
top="50"
halign="left"
name="image_quality_level"
top_delta="0"
width="115">
([QLVL])
</text>
</layout_panel>
</layout_stack>
</panel>

View File

@ -1,264 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
height="380"
layout="topleft"
name="panel_snapshot_flickr"
width="490">
<string
name="upload_message">
Uploading...
</string>
<!-- <FS:TS> Removing extraneous icon and text, since we use a tab bar -->
<!--
<icon
follows="top|left"
height="18"
image_name="Snapshot_Exodus_Flickr"
layout="topleft"
left="12"
mouse_opaque="true"
name="title_icon"
top="5"
width="18" />
<text
follows="top|left|right"
font="SansSerifBold"
height="20"
layout="topleft"
left_pad="12"
length="1"
name="title"
right="-10"
text_color="white"
type="string"
top_delta="3">
Flickr
</text>
<button
follows="right|top"
height="23"
is_toggle="true"
label="Metadata"
layout="topleft"
name="metadata_btn"
right="-82"
top_delta="-7"
width="70">
<button.commit_callback
function="Flickr.Metadata" />
</button>
<button
follows="right|top"
height="23"
is_toggle="true"
label="Settings"
layout="topleft"
name="settings_btn"
top_delta="0"
right="-10"
width="70">
<button.commit_callback
function="Flickr.Settings" />
</button>
<view_border
bevel_style="in"
follows="left|top|right"
height="1"
left="10"
layout="topleft"
name="hr"
right="-10"
top_pad="5"
/>
-->
<tab_container
follows="all"
height="376"
layout="topleft"
left="1"
name="flickr_panel_container"
top="5"
width="490">
<panel
follows="all"
layout="topleft"
label="Metadata"
name="panel_flickr_metadata"
width="490"
height="380">
<text
type="string"
length="1"
bottom="35"
follows="top|left"
font="SansSerif"
height="16"
layout="topleft"
left="12"
name="title_label"
top="10"
width="45">
Title:
</text>
<line_editor
follows="left|top|right"
height="20"
layout="topleft"
left_pad="5"
name="title_form"
right="-10"
top_delta="-4"
value="Snapshot" />
<text
type="string"
length="1"
bottom_delta="23"
follows="top|left"
font="SansSerif"
height="16"
layout="topleft"
left="12"
name="tags_label"
width="45">
Tags:
</text>
<line_editor
control_name="ExodusFlickrLastTags"
follows="left|top|right"
height="20"
layout="topleft"
left_pad="5"
max_length_bytes="100"
name="tags_form"
right="-10"
top_delta="-4" />
<text
type="string"
length="1"
bottom_delta="23"
follows="top|left"
font="SansSerif"
height="16"
layout="topleft"
left="12"
name="rating_label"
width="45">
Rating:
</text>
<icons_combo_box
follows="left|top|right"
height="20"
layout="topleft"
left_pad="5"
right="-90"
top_delta="-4"
label="Moderate"
name="rating_combo">
<icons_combo_box.drop_down_button
image_overlay="Parcel_M_Light"
image_overlay_alignment="left"
imgoverlay_label_space="3"
pad_left="3"/>
<icons_combo_box.item
label="General"
name="Safe"
value="1">
<item.columns
halign="center"
type="icon"
value="Parcel_PG_Light"
width="20"/>
</icons_combo_box.item>
<icons_combo_box.item
label="Moderate"
name="Moderate"
value="2">
<item.columns
halign="center"
type="icon"
value="Parcel_M_Light"
width="20"/>
</icons_combo_box.item>
<icons_combo_box.item
label="Adult"
name="Restricted"
value="3">
<item.columns
halign="center"
type="icon"
value="Parcel_R_Light"
width="20"/>
</icons_combo_box.item>
</icons_combo_box>
<check_box
control_name="ExodusFlickrShowPosition"
follows="top|right"
height="16"
layout="topleft"
right="-5"
top_delta="4"
name="location_check"
label="Include loc"
width="80"/>
<!-- bottom_delta="23" -->
<text
type="string"
length="1"
bottom_delta="15"
follows="top|left|right"
font="SansSerif"
layout="topleft"
left="12"
name="description_label"
right="-10">
Description (optional):
</text>
<text_editor
type="string"
length="1"
follows="left|top|right"
height="30"
layout="topleft"
left_delta="0"
max_length="700"
name="description_form"
right="-10"
top_pad="10"
word_wrap="true" />
<!-- <FS:TS> We don't use a cancel button on any other panel. -->
<!--
<button
follows="right|bottom"
height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
right="-32"
top="350"
width="100">
<button.commit_callback
function="Flickr.Cancel" />
</button>
-->
<!-- </FS:TS> -->
<button
follows="right|bottom"
height="23"
label="Upload"
layout="topleft"
right="-10"
name="upload_btn"
bottom="-1"
width="100">
<button.commit_callback
function="Flickr.Upload" />
</button>
</panel>
<panel
follows="all"
layout="topleft"
label="Settings"
name="exo_panel_flickr_settings"
filename="exo_panel_flickr_settings.xml" />
</tab_container>
</panel>

View File

@ -11458,59 +11458,6 @@ We strongly recommend that you not set the bandwidth above 1500 KBPS. This is un
<!-- </FS:TS> FIRE-6795 -->
<!-- </FS:HG> FIRE-6340, FIRE-6567 - Setting Bandwidth issues-->
<!-- <FS:TS> FIRE-5453: Flickr upload support (from Exodus) -->
<notification
icon="alertmodal.tga"
name="ExodusFlickrVerificationExplanation"
type="alertmodal">
To use the Flickr upload feature you must authorize [APP_NAME] to access your account. If you proceed, your web browser will open Flickr's website, where you will be prompted to log in and authorize [APP_NAME]. You will then be given a code to copy back into [APP_NAME].
Would you like to authorize [APP_NAME] to post to your Flickr account?
<tag>fail</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
yestext="Yes"/>
</notification>
<notification
icon="alertmodal.tga"
name="ExodusFlickrVerificationPrompt"
type="alertmodal">
Please authorize [APP_NAME] to post to your Flickr account in your web browser, then type the code given by the website below:
<tag>confirm</tag>
<form name="form">
<input name="oauth_verifier" type="text" default="true"/>
<button
index="0"
name="OK"
text="OK"/>
<button
index="1"
name="Cancel"
text="Cancel"/>
</form>
</notification>
<notification
icon="alertmodal.tga"
name="ExodusFlickrVerificationFailed"
type="alertmodal">
Flickr verification failed. Please try again, and be sure to double check the verification code.
<tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="notifytip.tga"
name="ExodusFlickrUploadComplete"
type="notifytip">
Your snapshot can now be viewed [http://www.flickr.com/photos/upload/edit/?ids=[ID] here].
</notification>
<!-- </FS:TS> FIRE-5453 -->
<notification
icon="alertmodal.tga"
name="FirstUseFlyOverride"

View File

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_flickr_settings">
<combo_box label="Resolución" name="flickr_size_combo">
<combo_box.item label="Ventana actual" name="CurrentWindow"/>
<combo_box.item label="Personalizado" name="Custom"/>
</combo_box>
<layout_stack name="flickr_image_params_ls">
<layout_panel name="flickr_image_size_lp">
<spinner label="Ancho" name="flickr_snapshot_width"/>
<spinner label="Alto" name="flickr_snapshot_height"/>
<check_box label="Mantener proporciones" name="flickr_keep_aspect_check"/>
</layout_panel>
<layout_panel name="flickr_image_format_quality_lp">
<combo_box control_name="ExodusFlickrSnapshotFormat" label="Formato" name="flickr_format_combo">
<combo_box.item label="PNG (sin pérdida)" name="PNG"/>
</combo_box>
<slider label="Calidad" name="image_quality_slider"/>
</layout_panel>
</layout_stack>
</panel>

View File

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_snapshot_flickr">
<string name="upload_message">
Cargando...
</string>
<tab_container name="flickr_panel_container">
<panel label="Metadatos" name="panel_flickr_metadata">
<text name="title_label">
Título:
</text>
<line_editor name="title_form" value="Instantánea"/>
<text name="tags_label">
Tags:
</text>
<text name="rating_label">
Calific.:
</text>
<icons_combo_box label="Moderado" name="rating_combo">
<icons_combo_box.item label="General" name="Safe"/>
<icons_combo_box.item label="Moderado" name="Moderate"/>
<icons_combo_box.item label="Adulto" name="Restricted"/>
</icons_combo_box>
<check_box name="location_check" label="Incluir loc."/>
<text name="description_label">
Descripción (opcional):
</text>
<button label="Subir" name="upload_btn"/>
</panel>
<panel label="Configuración" name="exo_panel_flickr_settings"/>
</tab_container>
</panel>

View File

@ -5263,26 +5263,6 @@ Intento cancelado.
Recomendamos encarecidamente no configurar el ancho de banda por encima de 1500 kbps. Es improbable que funcione bien y casi seguro no mejorará el rendimiento.
<usetemplate name="okbutton" yestext="Aceptar"/>
</notification>
<notification name="ExodusFlickrVerificationExplanation">
Para usar la característica de subida a Flickr debes autorizar a [APP_NAME] a acceder a tu cuenta. Si procedes, tu navegador web abrirá la página de Flickr, donde se te pedirá que inicies sesión y autorices a [APP_NAME]. Se te dará un código para usarlo en [APP_NAME].
¿Deseas autorizar a [APP_NAME] a publicar en tu cuenta de Flickr?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="ExodusFlickrVerificationPrompt">
Por favor, autoriza a [APP_NAME] a publicar en tu cuenta Flickr en tu navegador web, y copia abajo el código que se te dará:
<form name="form">
<button name="OK" text="Aceptar"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
<notification name="ExodusFlickrVerificationFailed">
La verificación Flickr ha fallado. Por favor, inténtalo de nuevo, y asegúrate de que el código de verificación sea correcto.
<usetemplate name="okbutton" yestext="Aceptar"/>
</notification>
<notification name="ExodusFlickrUploadComplete">
Tu instantánea puede ser vista ahora [http://www.flickr.com/photos/upload/edit/?ids=[ID] aquí].
</notification>
<notification name="FirstUseFlyOverride">
Precaución: ¡Usa la anulación de la prohibición de volar de forma responsable! Usarla sin el permiso del propietario del terreno puede derivar en la expulsión de tu avatar de la parcela en la que estás volando.
<usetemplate name="okbutton" yestext="Aceptar"/>

View File

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_flickr_settings">
<combo_box label="Rozdzielczość" name="flickr_size_combo">
<combo_box.item label="Obecne okno" name="CurrentWindow" />
<combo_box.item label="Własna" name="Custom" />
</combo_box>
<layout_stack name="flickr_image_params_ls">
<layout_panel name="flickr_image_size_lp">
<spinner label="Szer." name="flickr_snapshot_width" />
<spinner label="Wys." name="flickr_snapshot_height" />
<check_box label="Zachowaj proporcje" name="flickr_keep_aspect_check" />
</layout_panel>
<layout_panel name="flickr_image_format_quality_lp">
<combo_box label="Format" name="flickr_format_combo">
<combo_box.item label="PNG (bezstratny)" name="PNG" />
</combo_box>
<slider label="Jakość" name="image_quality_slider" />
</layout_panel>
</layout_stack>
</panel>

View File

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_snapshot_flickr">
<string name="upload_message">
Ładowanie...
</string>
<tab_container name="flickr_panel_container">
<panel label="Metadane" name="panel_flickr_metadata">
<text name="title_label">
Tytuł:
</text>
<line_editor name="title_form" value="Zdjęcie" />
<text name="tags_label">
Tagi:
</text>
<text name="rating_label">
Treść:
</text>
<icons_combo_box label="Umiarkowanie" name="rating_combo">
<icons_combo_box.item label="Dla wszystkich (General)" name="Safe" />
<icons_combo_box.item label="Umiarkowana (Moderate)" name="Moderate" />
<icons_combo_box.item label="Dla dorosłych (Adult)" name="Restricted" />
</icons_combo_box>
<check_box name="location_check" label="Lokalizacja" />
<text name="description_label">
Opis (opcjonalnie):
</text>
<button label="Załaduj" name="upload_btn" />
</panel>
<panel label="Ustawienia" name="exo_panel_flickr_settings" />
</tab_container>
</panel>

View File

@ -4361,24 +4361,6 @@ Spróbuj zaznaczyć mniejszy obszar ziemi.
<notification name="FSBWTooHigh">
Mocno zalecamy nie ustawiać przepustowości powyżej 1500 kbps. Jest mało prawdopodobne, aby takie ustawienie nie sprawiało problemów i prawie na pewno nie spowoduje wzrostu wydajności.
</notification>
<notification name="ExodusFlickrVerificationExplanation">
Aby móc ładować zdjęcia na Flickr musisz autoryzować dostęp do konta dla [APP_NAME]. Jeśli kontynuujesz, to Twoja przeglądarka internetowa otworzy stronę Flickr, gdzie zostaniesz poproszony/a, aby autoryzować [APP_NAME]. Dostaniesz kod, który będzie trzeba wkleić w odpowiednie pole [APP_NAME].
Czy chcesz autoryzować [APP_NAME] do ładowania zdjęć na Flickr?
<usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
</notification>
<notification name="ExodusFlickrVerificationPrompt">
Przeprowadź autoryzację [APP_NAME] dla wysyłania zdjęć na Flickr w przeglądarce internetowej i wpisz otrzymany kod poniżej:
<form name="form">
<button name="Cancel" text="Anuluj"/>
</form>
</notification>
<notification name="ExodusFlickrVerificationFailed">
Autoryzacja Flickr nie powiodła się. Spróbuj ponownie i sprawdź dokładnie kod weryfikacyjny.
</notification>
<notification name="ExodusFlickrUploadComplete">
Możesz znaleźć swoje zdjęcie [http://www.flickr.com/photos/upload/edit/?ids=[ID] tutaj].
</notification>
<notification name="FirstUseFlyOverride">
Uwaga: Używaj Wymuszania Latania z rozwagą! Stosowanie tej opcji bez zezwolenia właściciela działki może poskutkować zbanowaniem Twojego awatara z działki, nad którą będziesz latać.
</notification>