def __init__(self, consumer_key=None, consumer_secret=None, oauth_token_key=None, oauth_token_secret=None):
   self.consumer = oauth.OAuthConsumer(consumer_key, consumer_secret)
   self.signature_method = oauth.OAuthSignatureMethod_HMAC_SHA1()
   if oauth_token_key and oauth_token_secret:
       self.token = oauth.OAuthConsumer(oauth_token_key, oauth_token_secret)
   else:
       self.token = None          
   self.url_fetcher = UrlFetcher() 
class MySpaceContext():
    
    
    def __init__(self, consumer_key=None, consumer_secret=None, oauth_token_key=None, oauth_token_secret=None):
      self.consumer = oauth.OAuthConsumer(consumer_key, consumer_secret)
      self.signature_method = oauth.OAuthSignatureMethod_HMAC_SHA1()
      if oauth_token_key and oauth_token_secret:
          self.token = oauth.OAuthConsumer(oauth_token_key, oauth_token_secret)
      else:
          self.token = None          
      self.url_fetcher = UrlFetcher() 
      
    """OAuth Related functions 
    """  
    def get_request_token(self):
        resp = self.__call_oauth_api(OAUTH_REQUEST_TOKEN_URL)
        token = oauth.OAuthToken.from_string(resp)       
        return token

    def get_authorization_url(self, token, callback_url):
        oauth_request = oauth.OAuthRequest.from_token_and_callback(
            token=token, callback=callback_url, http_url=OAUTH_AUTHORIZATION_URL
        )
        oauth_request.sign_request(self.signature_method, self.consumer, token)
        return oauth_request.to_url()

    def get_access_token(self, request_token):
        resp = self.__call_oauth_api(OAUTH_ACCESS_TOKEN_URL, token=request_token)
        token = oauth.OAuthToken.from_string(resp)
        
        return token
      
    
    """Miscellaneous utility functions 
    """
    def validate_params(self, params):
        invalid_param = 'Invalid Parameter Value. %s %s'
        # Non empty/None param check
        non_empty_params = ['user_id', 'app_id']
        for param, value in params.items():
            if param in non_empty_params:
                try:
                    user_id = int(value)
                except (ValueError, TypeError):
                    message = invalid_param % (param, ' must be an integer')
                    raise MySpaceError(message)
                    return
        #Non-negative param check
        positive_params = ['page', 'page_size', 'user_id', 'video_id', 'photo_id', 'album_id', 'mood']
        for param, value in params.items():
            if param in positive_params and value is not None:
                if value < 0:
                    message = invalid_param % (param, ' cannot be negative')
                    raise MySpaceError(message)
                    return
        
    def __call_oauth_api(self, oauth_url, token=None, debug=False):
        oauth_request = oauth.OAuthRequest.from_consumer_and_token(
            self.consumer, token=token, http_url=oauth_url
        )
        oauth_request.sign_request(self.signature_method, self.consumer, token)
        resp = self.url_fetcher.fetch(oauth_request.to_url())
        if resp.status != 200:
            raise MySpaceError('MySpace OAuth API returned an error', resp)
        return resp.body 
      
    #def __call_myspace_api(self, api_url, method='GET', parameters=None, debug=False, get_raw_response=False, body=None):      
    def callmyspaceapi(self, api_url, method='GET', parameters=None, debug=False, get_raw_response=False, body=None,flag=None):
        access_token = self.token
        
        
        # Use POST for PUT as well. Set up http_method correctly for base string generation + signing
        http_method = 'POST' if (method == 'POST' or method == 'PUT') else method
        oauth_request = oauth.OAuthRequest.from_consumer_and_token(
            self.consumer, token=access_token, http_method=http_method, http_url=api_url, parameters=parameters
        )
        oauth_request.sign_request(self.signature_method, self.consumer, access_token)

        headers = {}
        #body = None
        if (method == 'PUT'):
            headers['X-HTTP-Method-Override'] = 'PUT'      
        
        if (method == 'POST' and flag == 'image'):
            headers['Content-type'] = 'image/jpeg'    
        
        if (method == 'POST' and flag == 'video'):
            headers['Content-type'] = 'video/mpeg' 
            
        # Generate POST/PUT body
        if (body is not None and flag is None):
            if (method == 'PUT' or method == 'POST' ):
                body += '&'.join('%s=%s' % (oauth.escape(str(k)), oauth.escape(str(v))) for k, v in parameters.iteritems())           
       
        """Get the request URL. For GET it's oauth_request.to_url(). For POST/PUT the URL should have just the oauth
           related params in the query string. Any request specific params go into the POST body - this is due to the
           way MySpace implements it's oauth
        """       
        request_url = oauth_request.to_url()
        if (method == 'POST' or method == 'PUT' ):
            qs = urlparse.urlparse(oauth_request.to_url())[4]
            qparams = oauth_request._split_url_string(qs)
            qs = '&'.join('%s=%s' % (oauth.escape(str(k)), oauth.escape(str(v))) for k, v in qparams.iteritems())
            request_url = oauth_request.get_normalized_http_url() + '?' + qs
            
        resp = self.url_fetcher.fetch(request_url, body=body, headers=headers)
        if resp.status > 201:
            raise MySpaceError('MySpace REST API returned an error', resp)
        api_response = resp.body if get_raw_response else simplejson.loads(resp.body)        
        return api_response