diff options
Diffstat (limited to 'indra')
-rw-r--r-- | indra/newview/llfacebookconnect.cpp | 107 | ||||
-rw-r--r-- | indra/newview/llfacebookconnect.h | 16 | ||||
-rwxr-xr-x | indra/newview/llfloatersnapshot.cpp | 3 | ||||
-rwxr-xr-x | indra/newview/llpanelpeople.cpp | 10 | ||||
-rwxr-xr-x | indra/newview/llpanelpeople.h | 1 | ||||
-rwxr-xr-x | indra/newview/llpanelsnapshotfacebook.cpp | 19 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/menu_gear_fbc.xml | 9 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/notifications.xml | 2 |
8 files changed, 105 insertions, 62 deletions
diff --git a/indra/newview/llfacebookconnect.cpp b/indra/newview/llfacebookconnect.cpp index 348e2c2e90..b0b773d508 100644 --- a/indra/newview/llfacebookconnect.cpp +++ b/indra/newview/llfacebookconnect.cpp @@ -35,19 +35,23 @@ #include "llhttpclient.h" #include "llnotificationsutil.h" #include "llurlaction.h" +#include "llimagepng.h" // Local function -void prompt_user_for_error(U32 status, const std::string& reason) +void prompt_user_for_error(U32 status, const std::string& reason, const std::string& code, const std::string& description) { // Note: 302 (redirect) is *not* an error that warrants prompting the user if (status != 302) { LLSD args(LLSD::emptyMap()); std::stringstream msg; - msg << reason << " (Code " << status << ")"; - args["FAIL_REASON"] = msg.str(); - LLNotificationsUtil::add("FacebookCannotConnect",args); + msg << status; + args["STATUS"] = msg.str(); + args["REASON"] = reason; + args["CODE"] = code; + args["DESCRIPTION"] = description; + LLNotificationsUtil::add("FacebookCannotConnect", args); } } @@ -96,7 +100,7 @@ public: } else { - prompt_user_for_error(status,reason); + prompt_user_for_error(status, reason, content.get("error_code"), content.get("error_description")); LL_WARNS("FacebookConnect") << "Failed to get a response. reason: " << reason << " status: " << status << LL_ENDL; } } @@ -113,11 +117,14 @@ public: /////////////////////////////////////////////////////////////////////////////// // -class LLFacebookPostResponder : public LLHTTPClient::Responder +class LLFacebookShareResponder : public LLHTTPClient::Responder { - LOG_CLASS(LLFacebookPostResponder); + LOG_CLASS(LLFacebookShareResponder); public: + LLFacebookShareResponder() {} + LLFacebookShareResponder(LLFacebookConnect::share_callback_t cb) : mShareCallback(cb) {} + virtual void completed(U32 status, const std::string& reason, const LLSD& content) { if (isGoodStatus(status)) @@ -126,9 +133,14 @@ public: } else { - prompt_user_for_error(status,reason); + prompt_user_for_error(status, reason, content.get("error_code"), content.get("error_description")); LL_WARNS("FacebookConnect") << "Failed to get a post response. reason: " << reason << " status: " << status << LL_ENDL; } + + if (mShareCallback) + { + mShareCallback(isGoodStatus(status)); + } } void completedHeader(U32 status, const std::string& reason, const LLSD& content) @@ -139,6 +151,8 @@ public: } } +private: + LLFacebookConnect::share_callback_t mShareCallback; }; /////////////////////////////////////////////////////////////////////////////// @@ -160,7 +174,7 @@ public: } else { - prompt_user_for_error(status,reason); + prompt_user_for_error(status, reason, content.get("error_code"), content.get("error_description")); LL_WARNS("FacebookConnect") << "Failed to get a response. reason: " << reason << " status: " << status << LL_ENDL; } } @@ -196,7 +210,7 @@ public: } else { - prompt_user_for_error(status,reason); + prompt_user_for_error(status, reason, content.get("error_code"), content.get("error_description")); } } } @@ -221,7 +235,7 @@ public: } else { - prompt_user_for_error(status,reason); + prompt_user_for_error(status, reason, content.get("error_code"), content.get("error_description")); LL_WARNS("FacebookConnect") << "Failed to get a response. reason: " << reason << " status: " << status << LL_ENDL; } } @@ -314,27 +328,7 @@ void LLFacebookConnect::postCheckin(const std::string& location, const std::stri body["message"] = message; // Note: we can use that route for different publish action. We should be able to use the same responder. - LLHTTPClient::post(getFacebookConnectURL("/share/checkin"), body, new LLFacebookPostResponder()); -} - -void LLFacebookConnect::postCheckinMessage(const std::string& message, const std::string& link, const std::string& name, const std::string& caption, const std::string& description, const std::string& picture) -{ - LLSD body; - if (!message.empty()) - body["message"] = message; - if (!link.empty()) - body["link"] = link; - if (!name.empty()) - body["name"] = name; - if (!caption.empty()) - body["caption"] = caption; - if (!description.empty()) - body["description"] = description; - if (!picture.empty()) - body["picture"] = picture; - - // Note: we can use that route for different publish action. We should be able to use the same responder. - LLHTTPClient::post(getFacebookConnectURL("/share/wall"), body, new LLFacebookPostResponder()); + LLHTTPClient::post(getFacebookConnectURL("/share/checkin"), body, new LLFacebookShareResponder(mPostCheckinCallback)); } void LLFacebookConnect::sharePhoto(const std::string& image_url, const std::string& caption) @@ -344,7 +338,52 @@ void LLFacebookConnect::sharePhoto(const std::string& image_url, const std::stri body["caption"] = caption; // Note: we can use that route for different publish action. We should be able to use the same responder. - LLHTTPClient::post(getFacebookConnectURL("/share/photo"), body, new LLFacebookPostResponder()); + LLHTTPClient::post(getFacebookConnectURL("/share/photo"), body, new LLFacebookShareResponder()); +} + +void LLFacebookConnect::sharePhoto(LLPointer<LLImageFormatted> image, const std::string& caption) +{ + // All this code is mostly copied from LLWebProfile::post() + if (dynamic_cast<LLImagePNG*>(image.get()) == 0) + { + llwarns << "Image to upload is not a PNG" << llendl; + llassert(dynamic_cast<LLImagePNG*>(image.get()) != 0); + return; + } + + const std::string boundary = "----------------------------0123abcdefab"; + + LLSD headers; + headers["Content-Type"] = "multipart/form-data; boundary=" + boundary; + + std::ostringstream body; + + // *NOTE: The order seems to matter. + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"caption\"\r\n\r\n" + << caption << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"image\"; filename=\"snapshot.png\"\r\n" + << "Content-Type: image/png\r\n\r\n"; + + // Insert the image data. + // *FIX: Treating this as a string will probably screw it up ... + U8* image_data = image->getData(); + for (S32 i = 0; i < image->getDataSize(); ++i) + { + body << image_data[i]; + } + + body << "\r\n--" << boundary << "--\r\n"; + + // postRaw() takes ownership of the buffer and releases it later. + size_t size = body.str().size(); + U8 *data = new U8[size]; + memcpy(data, body.str().data(), size); + + // Note: we can use that route for different publish action. We should be able to use the same responder. + LLHTTPClient::postRaw(getFacebookConnectURL("/share/photo"), data, size, new LLFacebookShareResponder(mSharePhotoCallback), headers); } void LLFacebookConnect::updateStatus(const std::string& message) @@ -353,7 +392,7 @@ void LLFacebookConnect::updateStatus(const std::string& message) body["message"] = message; // Note: we can use that route for different publish action. We should be able to use the same responder. - LLHTTPClient::post(getFacebookConnectURL("/share/wall"), body, new LLFacebookPostResponder()); + LLHTTPClient::post(getFacebookConnectURL("/share/wall"), body, new LLFacebookShareResponder(mUpdateStatusCallback)); } void LLFacebookConnect::storeContent(const LLSD& content) diff --git a/indra/newview/llfacebookconnect.h b/indra/newview/llfacebookconnect.h index 58e2707ba3..37b4e2bc94 100644 --- a/indra/newview/llfacebookconnect.h +++ b/indra/newview/llfacebookconnect.h @@ -29,6 +29,7 @@ #define LL_LLFACEBOOKCONNECT_H #include "llsingleton.h" +#include "llimage.h" /** * @class LLFacebookConnect @@ -40,6 +41,8 @@ class LLFacebookConnect : public LLSingleton<LLFacebookConnect> { LOG_CLASS(LLFacebookConnect); public: + typedef boost::function<void(bool ok)> share_callback_t; + void connectToFacebook(const std::string& auth_code = ""); void disconnectFromFacebook(); void tryToReconnectToFacebook(); @@ -47,9 +50,13 @@ public: void loadFacebookFriends(); void postCheckin(const std::string& location, const std::string& name, const std::string& description, const std::string& picture, const std::string& message); - void postCheckinMessage(const std::string& message, const std::string& link, const std::string& name, const std::string& caption, const std::string& description, const std::string& picture); - void sharePhoto(const std::string& image_url, const std::string& caption); + void sharePhoto(const std::string& image_url, const std::string& caption); + void sharePhoto(LLPointer<LLImageFormatted> image, const std::string& caption); void updateStatus(const std::string& message); + + void setPostCheckinCallback(share_callback_t cb) { mPostCheckinCallback = cb; } + void setSharePhotoCallback(share_callback_t cb) { mSharePhotoCallback = cb; } + void setUpdateStatusCallback(share_callback_t cb) { mUpdateStatusCallback = cb; } void clearContent(); void storeContent(const LLSD& content); @@ -60,6 +67,7 @@ public: S32 generation() { return mGeneration; } void openFacebookWeb(std::string url); + private: friend class LLSingleton<LLFacebookConnect>; @@ -71,6 +79,10 @@ private: bool mConnectedToFbc; LLSD mContent; S32 mGeneration; + + share_callback_t mPostCheckinCallback; + share_callback_t mSharePhotoCallback; + share_callback_t mUpdateStatusCallback; }; #endif // LL_LLFACEBOOKCONNECT_H diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 8405d8aeec..d60f9a48c4 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -2038,7 +2038,8 @@ BOOL LLFloaterSnapshot::postBuild() getChild<LLUICtrl>("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot")); childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this); - + + LLFacebookConnect::instance().setSharePhotoCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, _1)); LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, _1)); LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, _1)); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 5bc645bcfd..4f91a65dfa 100755 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -571,7 +571,6 @@ LLPanelPeople::LLPanelPeople() mCommitCallbackRegistrar.add("People.sendFBC", boost::bind(&LLPanelPeople::onFacebookAppSendClicked, this)); mCommitCallbackRegistrar.add("People.testaddFBC", boost::bind(&LLPanelPeople::onFacebookTestAddClicked, this)); mCommitCallbackRegistrar.add("People.testaddFBCFolderView", boost::bind(&LLPanelPeople::addTestParticipant, this)); - mCommitCallbackRegistrar.add("People.testFBCCheckin", boost::bind(&LLPanelPeople::onFacebookCheckinClicked, this)); mCommitCallbackRegistrar.add("People.AddFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this)); mCommitCallbackRegistrar.add("People.AddFriendWizard", boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked, this)); @@ -1760,15 +1759,6 @@ void LLPanelPeople::onLoginFbcButtonClicked() } } -void LLPanelPeople::onFacebookCheckinClicked() -{ - // Get the local SLURL - LLSLURL slurl; - LLAgentUI::buildSLURL(slurl); - - LLFacebookConnect::instance().postCheckinMessage("Here I am in SL!", slurl.getSLURLString(), slurl.getRegion(), "", "", ""); -} - void LLPanelPeople::onFacebookAppRequestClicked() { } diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 9cfa6b7cd2..633f475be7 100755 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -124,7 +124,6 @@ private: void onFacebookAppRequestClicked(); void onFacebookAppSendClicked(); void onFacebookTestAddClicked(); - void onFacebookCheckinClicked(); bool onFriendsViewSortMenuItemCheck(const LLSD& userdata); bool onRecentViewSortMenuItemCheck(const LLSD& userdata); diff --git a/indra/newview/llpanelsnapshotfacebook.cpp b/indra/newview/llpanelsnapshotfacebook.cpp index 7c8fc044c0..30ef5f326c 100755 --- a/indra/newview/llpanelsnapshotfacebook.cpp +++ b/indra/newview/llpanelsnapshotfacebook.cpp @@ -39,6 +39,8 @@ #include "llwebprofile.h" #include "llfacebookconnect.h" +#include "llslurl.h" +#include "llagentui.h" /** * Posts a snapshot to the resident Facebook account. @@ -113,12 +115,19 @@ void LLPanelSnapshotFacebook::onSend() { std::string caption = getChild<LLUICtrl>("caption")->getValue().asString(); bool add_location = getChild<LLUICtrl>("add_location_cb")->getValue().asBoolean(); - - LLWebProfile::uploadImage(LLFloaterSnapshot::getImageData(), caption, add_location, boost::bind(&LLPanelSnapshotFacebook::onImageUploaded, this, caption, _1)); + + if (add_location) + { + LLSLURL slurl; + LLAgentUI::buildSLURL(slurl); + if (caption.empty()) + caption = slurl.getSLURLString(); + else + caption = caption + " " + slurl.getSLURLString(); + } + LLFacebookConnect::instance().sharePhoto(LLFloaterSnapshot::getImageData(), caption); + //LLWebProfile::uploadImage(LLFloaterSnapshot::getImageData(), caption, add_location, boost::bind(&LLPanelSnapshotFacebook::onImageUploaded, this, caption, _1)); LLFloaterSnapshot::postSave(); - - // test with a placeholder image, until we can figure out a way to grab the uploaded image url - LLFacebookConnect::instance().sharePhoto("http://fc02.deviantart.net/fs43/i/2009/125/a/9/Future_of_Frog_by_axcho.jpg", caption); } void LLPanelSnapshotFacebook::onImageUploaded(const std::string& caption, const std::string& image_url) diff --git a/indra/newview/skins/default/xui/en/menu_gear_fbc.xml b/indra/newview/skins/default/xui/en/menu_gear_fbc.xml index 2c341b6ecc..cf27f528ee 100644 --- a/indra/newview/skins/default/xui/en/menu_gear_fbc.xml +++ b/indra/newview/skins/default/xui/en/menu_gear_fbc.xml @@ -40,12 +40,5 @@ name="Facebook App Add"> <menu_item_check.on_click function="People.testaddFBCFolderView"/> - </menu_item_check> - <menu_item_check - label="Facebook post checkin message" - layout="topleft" - name="Facebook Checkin"> - <menu_item_check.on_click - function="People.testFBCCheckin"/> </menu_item_check> -</toggleable_menu>
\ No newline at end of file +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index d69f1bb4d5..d1d8291c90 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5444,7 +5444,7 @@ Sorry, the settings couldn't be applied to the region. Leaving the region and t icon="alertmodal.tga" name="FacebookCannotConnect" type="alertmodal"> -Connection to Facebook failed. Reason: [FAIL_REASON]. +Connection to Facebook failed. Reason: [STATUS] [REASON] ([CODE] - [DESCRIPTION]) <usetemplate name="okbutton" yestext="OK"/> |